如何從字典的鍵和值創建變量?下面的提取(如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就是描述這個操作的方式。 –