我在Julia表达式中遇到了一些范围基础知识。有人可以帮助告诉我下面的for循环中出了什么问题吗?在lopp内部,第一个表达式起作用而第二个表达式不起作用,尽管两个表达式都适用于全局范围内的变量。
x = 1
glob_obj = :x
eval(:(println($glob_obj)))
eval(:(println("$glob_obj")))
# Prints
# 1
# x
objs = [:x]
for obj = objs
eval(:(println($obj)))
eval(:(println("$obj")))
end
# Prints
# 1
# ERROR: obj not defined
# in anonymous at no file:3
对于上下文,我最终有兴趣编写一个Julia函数,该函数从本地范围内的符号数组填充字典,即像
这样的函数x = 1
y = "foo"
populate_dict([:x, :y]) # ...resulting in
{ "x" => 1, "y" => "foo"}
重要的是,我希望能够在任何函数中使用它并让它从本地范围中获取变量。对于更多上下文,这是使用任意符号列表轻松编写JSON文件。
答案 0 :(得分:4)
您遇到的范围问题是eval
始终评估全局范围内的表达式(当前模块,除非另有说明)。在这种特殊情况下,您可以使用
println(obj)
而不是eval(:(println("$obj")))
;看这个符号本身没有必要进行评估!
但如果你的最终目标是在函数中获取局部变量的值,那么上面的答案就是eval
没有做到这一点。这是一个非常深刻的设计决策,允许编译器进行各种优化,否则它将无法进行。
然而,可以借助Debug
包获取本地变量,请参阅我对Execute a string?的回答。