eval 无法访问函数范围内的变量
eval could not access variable in function scope
在下面的 MnWE(最小不工作示例)中,当我调用 test(2) 时,出现错误:
ERROR: UndefVarError: var2 not defined in test at ./none:6
如何在不使用全局变量var1和var2的情况下解决这种情况。在我的真实情况下,var1 和 var2 是两个冗长的矩阵,只需要一次来确定变量 s1。将它们用作全局变量似乎很难看(而且效率低下),不是吗?
预先感谢您的帮助。
function test(arg)
var1=10
var2=100
s="var$arg"
s=symbol(s)
@eval($s)
end
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]()
在下面的 MnWE(最小不工作示例)中,当我调用 test(2) 时,出现错误:
ERROR: UndefVarError: var2 not defined in test at ./none:6
如何在不使用全局变量var1和var2的情况下解决这种情况。在我的真实情况下,var1 和 var2 是两个冗长的矩阵,只需要一次来确定变量 s1。将它们用作全局变量似乎很难看(而且效率低下),不是吗?
预先感谢您的帮助。
function test(arg)
var1=10
var2=100
s="var$arg"
s=symbol(s)
@eval($s)
end
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]()