【问题标题】:Using eval in Julia to deal with varargs在 Julia 中使用 eval 处理可变参数
【发布时间】:2016-09-03 13:02:26
【问题描述】:

我刚刚开始使用 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 调用,那么它可以工作。

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

【问题讨论】:

标签: eval julia


【解决方案1】:

evaltoplevel scope 中运行,而不是在函数范围内。无法在函数范围内动态更新绑定。在不知道您的确切用例的情况下,我怀疑有一种方法可以在没有动态重新绑定的情况下做事。特别是v1v2等可能最好做成数组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

(我还修改了您的代码以避免parseing 字符串,最好通过expression interpolation 完成。)

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2015-07-04
    • 2012-05-13
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多