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

Function eval无法访问函数范围中的变量,function,julia,eval,Function,Julia,Eval,在下面的MnWE(最小不工作示例)中,当我调用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(

在下面的MnWE(最小不工作示例)中,当我调用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

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

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

function test(arg)
    var1=10
    var2=100
    d = Dict(1=>var1, 2=>var2)
    d[arg]
end
这里有一个
元组
(更简洁一点):

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

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

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

function test(arg)
    var1=10
    var2=100
    d = Dict(1=>var1, 2=>var2)
    d[arg]
end
这里有一个
元组
(更简洁一点):

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

伟大的谢谢你的解决方案,太好了。谢谢你的解决方案。