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]

如果 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]()