使用符号数组填充 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? 的回答。
我对 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? 的回答。