2014-07-08 8 views
9

ich ein zwei Hashes haben, die gleichen Schlüssel wie haben sollte:Wie zwei Hashes fusionieren, die gleichen Schlüssel in Ruby haben

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

Und ich möchte jeweils Werte wie folgt zusammenfassen:

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

Aber dieser Code funktioniert nicht, wenn die Reihenfolge der Schlüssel wie b = {a: 2, c: 4, b: 3} abweichen.

Wie kann ich den Code unter Berücksichtigung der Reihenfolge der Schlüssel schreiben?

Antwort

20

Verwenden Hash#merge oder 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} 

Der Block mit Schlüssel, alter Wert, neuer Wert genannt wird. Der Rückgabewert des Blocks wird als neuer Wert verwendet.

+0

Ich mag #merge mit Block. Wenn ich eine Chance bekomme, benutze ich es. –

+0

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

Verwandte Themen