使用符号数组填充 julia 字典

Populating a julia dictionary with an array of symbols

我对 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 文件。

您 运行 遇到的范围问题是 eval 总是在全局范围内计算表达式(当前模块,除非另有说明)。在这种特殊情况下,您可以使用

来处理
println(obj)

而不是eval(:(println("$obj")));无需评估即可查看符号本身!

但是,如果您的最终目标是在函数中获取局部变量的值,那么上述答案是 eval 不会这样做。这是一个非常深入的设计决策,它允许编译器进行各种优化,而这些优化是否则无法进行的。

但是可以借助 Debug 包获取局部变量,请参阅我对 Execute a string? 的回答。