Использование irb (ruby-1.9.2-p180):
list = [ {a:2, b:1, d:3}, {a:3, b:2, c:3}, {a:4, b:1, c:3} ]
=> [{:a=>2, :b=>1, :d=>3}, {:a=>3, :b=>2, :c=>3}, {:a=>4, :b=>1, :c=>3}]
Hash[list.map(&:keys).inject(&:&).map{|key| [key,list.map{|arr| arr[key]}.inject(&:+)]}]
=> {:a=>9, :b=>4}
это решение работает с несколькими массивами (2+), находит общие ключи и суммирует их, возвращая хэш результатов
найти общие ключи (собрать ключи и найти общую часть):
list.map(&:keys).inject(&:&)
найти сумму для ключа (выбрать значения по ключам и суммировать их):
list.map{|arr| arr[key]}.inject(&:+)]
для построенияХеш из массива пар [[:a,9], [:b,4]]
:
results = [[:a,9], [:b,4]]
Hash[ results ]
Мне нравится рубин для этого лайнера!