在下面的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
答案 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]
如果创建var1
或var2
代价很高,那么您可以使用以下模式:
function test(arg)
arg == 1 && return rand(10^7)
arg == 2 && return rand(10^6)
throw(ArgumentError("wrong value of arg ($arg)"))
end
在这种情况下,只执行相关的代码。如果在函数中包含var1
和var2
的生成,则可以使用上述两种方法实现相同的效果,例如
var1() = rand(10^7)
var2() = rand(10^6)
test(arg) = (var1, var2)[arg]()