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

Per assegnare valore alla hash nidificato, possiamo usaresicuro assegnare il valore di hash nidificato utilizzando Hash # dig o operatore solitario (e.)

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

Tuttavia, se una qualsiasi parte in mezzo manca , causerà un errore

Qualcosa di simile

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

non funziona, dal momento che non c'è Hash#dig= ancora disponibile.

Per assegnare in modo sicuro valore, che possiamo fare

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

ma c'è modo migliore per farlo?

+2

Per quel che vale, questo è stato discusso qui (e rifiutato da Matz (per il momento): https://bugs.ruby-lang.org/issues/11747 –

risposta

8

Non senza qualche raccomandazione (e non funziona se stai ricevendo l'hash da altrove), ma una soluzione comune è questa:

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

Sfortunatamente, l'hash era da qualche altra parte, ma grazie per il frammento! – sbs

+4

Puoi anche impostare il proc predefinito per gli hash esistenti: 'hsh.default_proc = proc {| h, k | h [k] = Hash.new (& h.default_proc)}' – Stefan