Link copiato negli appunti
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.