2013-01-12 10 views
12

Diciamo che ho un hash nidificato:Come impostare l'hash annidato in ruby ​​in modo dinamico?

h = { 'one' => 
     {'two' => 
      {'three' => 'a'} 
     } 
    } 

posso cambiare in questo modo:

h['one']['two']['three'] = 'b' 

Come posso cambiare il valore nidificato con una variabile come una chiave?

Diciamo che ho la seguente variabile:

key = "one.two.three" 

per accedervi in ​​modo dinamico, io uso il seguente:

key.split('.').inject(h,:[]) 

Ma naturalmente impostare in questo modo non funziona:

key.split('.').inject(h,:[]) = 'b' # fails 

Quindi, come posso impostare il valore di un hash annidato in modo dinamico?

risposta

15

Hash#[]= è un unico metodo. Non è possibile fare Hash#[] fino all'ultimo tasto e fare = ad esso. Piuttosto, lasciare fuori l'ultima chiave e fare Hash#[]= individualmente su di esso.

*key, last = key.split(".") 
key.inject(h, :fetch)[last] = "b" 
+0

Ho capito. Bella spiegazione – Markus

Problemi correlati