Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Ruby Diary #27: Versione ricorsiva di Hash#merge

Migliorare il funzionamento di Hash#merge consentendo il merge corretto di un Hash multidimensionale.
Migliorare il funzionamento di Hash#merge consentendo il merge corretto di un Hash multidimensionale.
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.

Ti consigliamo anche