【问题标题】:eval could not access variable in function scopeeval 无法访问函数范围内的变量
【发布时间】:2018-02-12 04:25:38
【问题描述】:

在下面的 MnWE(Minimal not Working Example)中,当我调用 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

【问题讨论】:

    标签: function julia eval


    【解决方案1】:

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

    【讨论】:

    • 太棒了。感谢您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-01-05
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多