2014-07-08 12 views
9

yakut aynı tuşları var iki karmaları birleştirmek için:nasıl gibi aynı anahtarları olmalıdır iki karmaları var

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

Ve böyle her değerlerin Özetle istiyorum:

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

Ancak, anahtarların sırası b = {a: 2, c: 4, b: 3} gibi farklıysa bu kod çalışmaz.

Anahtarların sırasını dikkate alarak kodu nasıl yazabilirim?

cevap

20

kullanın Hash#merge veya 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} 

blok tuşu, eski değerine, yeni değerle çağrılır. Ve bloğun dönüş değeri yeni bir değer olarak kullanılır.

+0

Ben blok ile #merge seviyorum. Bir şansım olursa onu kullanırım. –

+0

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

İlgili konular