如何从字典的键和值创建变量?下面的提取(如PHP)可能吗?导出键和字典的值作为变量名和值
julia> d = Dict(
"key1" =>111,
"key2" =>222,
"key3" =>333
);
julia> extract(d)
julia> key1, key2, key3
(111,222,333)
如何从字典的键和值创建变量?下面的提取(如PHP)可能吗?导出键和字典的值作为变量名和值
julia> d = Dict(
"key1" =>111,
"key2" =>222,
"key3" =>333
);
julia> extract(d)
julia> key1, key2, key3
(111,222,333)
有可能引入新的变量到全球范围与eval
只是重复:
julia> x = 1
1
julia> function testeval()
eval(:(x = 5))
return x
end
testeval (generic function with 1 method)
julia> testeval()
5
julia> x # the global x has changed!
5
安extract
函数可能看起来像这样:
julia> function extract(d)
expr = quote end
for (k, v) in d
push!(expr.args, :($(Symbol(k)) = $v))
end
eval(expr)
return
end
julia> extract(d)
julia> key1, key2, key3
(111,222,333)
请注意,每个模块都有其自己的全局范围。因此,这会将变量引入定义模块extract
函数的模块范围内,即,如果在REPL中定义了Main
模块(如示例中那样)。
使用eval
时应该非常小心,并首先考虑其他方法,例如David P. Sanders和Dan Getz提到的方法。
太棒了!感谢您的警告!我目前只使用它在程序开始时用json文件创建全局常量,而你的函数很适合这个目的。我修改了你的'''push!(expr.args,:(const $(Symbol(k))= $ v))'''。然后我会得到'''警告:如果我修改了它的值,重新定义常量key1'''。 – Phuoc
k = collect(keys(d))
v = collect(values(d))
键和值返回迭代器。 收集然后产生一个数组。
但需要注意的是,你往往不需要做到这一点,可以通过词典使用
for (k, v) in d
看看mauro3的包参数.jl(https://github.com/mauro3/Parameters.jl)。具体来说,解开Dict就是描述这个操作的方式。 –