2016-11-27 4 views
0

Wie könnte ich Variablen aus Schlüsseln und Werten eines Wörterbuchs erstellen? Ist der folgende Auszug (wie PHP) möglich?Schlüssel und Werte des Wörterbuchs als Variablenname und Wert exportieren

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

Schauen Sie sich mauro3 Paket Parameter.jl (https://github.com/mauro3/Parameters.jl). Insbesondere ist das Entpacken eines Dict die Art, wie diese Operation beschrieben wird. –

Antwort

1

Es ist möglich, die Einführung neuer Variablen in die globalen Umfang mit eval mit:

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 

Eine extract Funktion könnte wie folgt aussehen:

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) 

Beachten Sie, dass jedes Modul seinen eigenen globalen Geltungsbereich hat. Daher führt dies die Variablen in den Umfang des Moduls ein, in dem die extract-Funktion definiert ist, d. H. In das Main-Modul, wenn es bei der REPL wie im Beispiel definiert ist.

Sie sollten sehr vorsichtig sein, wenn Sie eval verwenden und zuerst andere Ansätze in Betracht ziehen, z. B. die von David P. Sanders und Dan Getz erwähnten.

+0

Es ist großartig! Danke für deine Warnung! Ich benutze dies derzeit nur zum Erstellen von globalen Konstanten aus einer JSON-Datei am Anfang eines Programms, Ihre Funktion passt gut zu diesem Zweck. Ich habe deine in '' 'push! (Expr.args,: (const $ (Symbol (k)) = $ v))' '' geändert. Dann bekomme ich '' 'WARNING: konstante Schlüssel1''' neu definiert, wenn ich seinen Wert ändere. – Phuoc

2
k = collect(keys(d)) 

v = collect(values(d)) 

Beide Schlüssel und Werte zurückgeben Iteratoren. Collect erzeugt dann ein Array.

Aber beachten Sie, dass Sie oft dies nicht tun müssen und nur iterieren durch das Wörterbuch kann

for (k, v) in d 
Verwandte Themen