2016-11-27 72 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