読者です 読者をやめる 読者になる 読者になる

キーが重複するハッシュをマージする

2つのハッシュをマージするときにキーが重複するとレシーバを優先されてしまう

$ pry
[1] pry(main)> h1 = {a: [1, 2, 3], b: [1, 2, 3]}
=> {:a=>[1, 2, 3], :b=>[1, 2, 3]}
[2] pry(main)> h2 = {a: [10], c: [10,11]}
=> {:a=>[10], :c=>[10, 11]}
[3] pry(main)> h1.merge(h2)
=> {:a=>[10], :b=>[1, 2, 3], :c=>[10, 11]}

Hash#mergeはブロックを受け取ることができて、キーが重複した時の挙動を指定することができる

$ pry
[1] pry(main)> h1 = {a: [1, 2, 3], b: [1, 2, 3]}
=> {:a=>[1, 2, 3], :b=>[1, 2, 3]}
[2] pry(main)> h2 = {a: [10], c: [10,11]}
=> {:a=>[10], :c=>[10, 11]}
[3] pry(main)> h1.merge(h2) { |key, h1v, h2v| h1v + h2v }
=> {:a=>[1, 2, 3, 10], :b=>[1, 2, 3], :c=>[10, 11]}

class Hash (Ruby 2.2.0)