2014-07-08 11 views
9

Ho un due hash che dovrebbe avere stesse chiavi come:Come unire due hash che hanno stesse chiavi in ​​rubino

a = {a: 1, b: 2, c: 3} 
b = {a: 2, b: 3, c: 4} 

E voglio riassumere ciascuna valori in questo modo:

if a.keys == b.keys 
    a.values.zip(b.values).map{|a, b| a+b} 
end 

Ma questo codice non funziona se l'ordine delle chiavi è diverso come b = {a: 2, c: 4, b: 3}.

Come posso scrivere il codice tenendo conto dell'ordine delle chiavi?

risposta

20

Usa Hash#merge o Hash#merge!:

a = {a: 1, b: 2, c: 3} 
b = {a: 2, c: 4, b: 3} 
a.merge!(b) { |k, o, n| o + n } 
a # => {:a=>3, :b=>5, :c=>7} 

Il blocco viene chiamato con chiave, valore vecchio, nuovo valore. E il valore di ritorno del blocco viene utilizzato come nuovo valore.

+0

Mi piace #merge con blocco. Se ho una possibilità, lo uso. –

+0

'Hash # merge!' Aka 'Hash # update'. –

Problemi correlati