我刚刚开始使用Julia。我试图使用eval(在Julia中)来定义函数中的一组变量。假设我想将v1设为2:
function fun_test(varargs...)
v1 = 0;
if length(varargs) > 0
j = collect(linspace(1,length(varargs)-1,length(varargs)/2));
for i in j
expr_vargs = parse("$(varargs[i]) = $(varargs[i+1]);");
eval(expr_vargs);
end
end
println(v1)
end
将该功能称为:
fun_test("v1", "2");
它不起作用,因为println返回0(v1的初始值)。但是,如果我在Julia的终端中运行类似的eval调用,那么它可以工作。
请您澄清一下为什么它不起作用以及如何解决它?
答案 0 :(得分:5)
eval
在toplevel scope中运行,而不在函数范围内。无法在函数范围内动态更新绑定。在不知道您的确切用例的情况下,我怀疑有一种方法可以在没有动态重新绑定的情况下执行操作。特别是,v1
,v2
等可能最好成为一个数组,V
。
然而,如果确实必须,你总是可以将v1
定义为子模块中的全局变量:
module FunTest
v1 = 0
function fun_test(varargs...)
if length(varargs) > 0
j = collect(linspace(1,length(varargs)-1,length(varargs)/2));
for i in j
@eval $(varargs[i]) = $(varargs[i+1])
end
end
println(v1)
end
export fun_test
end
using .FunTest
fun_test(:v1, 2) # result: 2
(我还修改了代码以避免parse
字符串,最好通过expression interpolation完成。)