2016-01-05 14 views
10
h = { 
    data: { 
    user: { 
     value: "John Doe" 
    } 
    } 
} 

Um Wert zu dem verschachtelten Hash zuweisen, wirsicher Wert verschachtelte Hash zuweisen Hash # dig oder Einsamen Operator (&).

h[:data][:user][:value] = "Bob" 

jedoch, wenn ein Teil in der Mitte fehlt verwenden können , es wird einen Fehler verursachen.

So etwas wie

h.dig(:data, :user, :value) = "Bob" 

wird nicht funktionieren, da es keine Hash#dig= vorhanden ist.

Um sicher Wert zuweisen, wir

h.dig(:data, :user)&.[]=(:value, "Bob") # or equivalently 
h.dig(:data, :user)&.store(:value, "Bob") 

tun können, aber es gibt bessere Möglichkeit, das zu tun?

+2

Für das, was es wert ist, hat dies hier diskutiert worden (und von Matz (vorerst) abgelehnt: https://bugs.ruby-lang.org/issues/11747 –

Antwort

8

Es ist nicht ohne Vorbehalte (und funktioniert nicht, wenn Sie den Hash aus anderen Ländern sind Empfangen), aber eine gemeinsame Lösung ist dies:

hash = Hash.new {|h,k| h[k] = h.class.new(&h.default_proc) } 

hash[:data][:user][:value] = "Bob" 
p hash 
# => { :data => { :user => { :value => "Bob" } } } 
+0

Leider war der Hash von woanders. Aber danke für das Snippet! – sbs

+4

Sie können auch die Standard-proc einstellen für vorhandene Hashes: 'hsh.default_proc = proc {| h, k | h [k] = Hash.neu (& h.default_proc)}' – Stefan