在Julia中使用eval来处理varargs

mer*_*rch 3 eval julia

我刚开始使用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
Run Code Online (Sandbox Code Playgroud)

将该功能称为:

fun_test("v1", "2");
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为println返回0(v1的初始值).但是,如果我在Julia的终端中运行类似的eval调用,那么它可以工作.

您能否澄清一下为什么它不起作用以及如何解决它?

Fen*_*ang 5

eval顶级范围内运行,而不是在功能范围内运行.无法在函数范围内动态更新绑定.在不知道您的确切用例的情况下,我怀疑有一种方法可以在没有动态重新绑定的情况下执行操作.特别是,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
Run Code Online (Sandbox Code Playgroud)

(我还修改了你的代码以避免parse字符串,最好通过表达式插值来完成.)