Esiste una funzione in Ruby chiamata Hash#merge che permette di fondere il contenuto dell'hash h2 in h1 restituendo il risultato. Hash#merge! esegue la stessa azione sovascrivendo h1 con il risultato.
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
h1 #=> {"a"=>100, "b"=>200}
Questo metodo funziona a meraviglia con gli Hash monodimensionali, il comportamento cambia con quelli multidimensionali. Osserviamo questo esempio.
h = {:a => {:b => :c}}.merge({:a => {:l => :x}})
puts h #=> {:a=> {:l => :x}}
In questo caso il risultato non è scontato. L'indice :a ha esiste in entrambi gli hash dunque viene sostituito dal più recente.
Ma se io invece volessi realmente fondere i due Hash? Gironzolando ho trovato un'alternativa chiamata Hash#deep_merge.
Il risultato è proprio quello che ci serve.
h = {:a => {:b => :c}}.deep_merge({:a => {:l => :x}})
puts h #=> {:a => {:b => :c, :l => :x}}
Non so voi, io avrei ritenuto più sensato il secondo comportamento.
Se vuoi aggiornamenti su Ruby inserisci la tua email nel box qui sotto: