2016-11-27 107 views
0

如何從字典的鍵和值創建變量?下面的提取(如PHP)可能嗎?導出鍵和字典的值作爲變量名和值

julia> d = Dict(
    "key1" =>111, 
    "key2" =>222, 
    "key3" =>333 
); 
julia> extract(d) 
julia> key1, key2, key3 
(111,222,333) 
+2

看看mauro3的包參數.jl(https://github.com/mauro3/Parameters.jl)。具體來說,解開Dict就是描述這個操作的方式。 –

回答

1

有可能引入新的變量到全球範圍與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提到的方法。

+0

太棒了!感謝您的警告!我目前只使用它在程序開始時用json文件創建全局常量,而你的函數很適合這個目的。我修改了你的'''push!(expr.args,:(const $(Symbol(k))= $ v))'''。然後我會得到'''警告:如果我修改了它的值,重新定義常量key1'''。 – Phuoc

2
k = collect(keys(d)) 

v = collect(values(d)) 

鍵和值返回迭代器。 收集然後產生一個數組。

但需要注意的是,你往往不需要做到這一點,可以通過詞典使用

for (k, v) in d