eval无法访问函数范围中的变量

时间:2018-02-11 17:27:19

标签: function julia eval

在下面的MnWE(Minimal not Working Example)中,当我调用test(2)时,我收到了错误:

  

错误:UndefVarError:var2未在./none:6的测试中定义

如何在不使用全局变量var1和var2的情况下解决这种情况。在我的实际情况中,var1和var2是两个冗长的矩阵,只需要一次来确定变量s1。使用它们作为全局变量看起来很丑(并且无效),不是吗?

提前感谢您的帮助。

function test(arg)
var1=10
var2=100
s="var$arg"
s=symbol(s)
@eval($s)
end

1 个答案:

答案 0 :(得分:3)

eval总是在当前模块的全局范围内计算表达式,因此在函数内定义的变量不在此范围内。

我个人会在你出现的情况下使用元组,向量或字典。例如,这里是使用Dict的代码:

function test(arg)
    var1=10
    var2=100
    d = Dict(1=>var1, 2=>var2)
    d[arg]
end

这里有一个Tuple(还有一点简洁):

test(arg) = (10, 100)[arg]

如果创建var1var2代价很高,那么您可以使用以下模式:

function test(arg)
    arg == 1 && return rand(10^7)
    arg == 2 && return rand(10^6)
    throw(ArgumentError("wrong value of arg ($arg)"))
end

在这种情况下,只执行相关的代码。如果在函数中包含var1var2的生成,则可以使用上述两种方法实现相同的效果,例如

var1() = rand(10^7)
var2() = rand(10^6)
test(arg) = (var1, var2)[arg]()