ハッシュのマージ
Hash#mergeでハッシュをマージします。ブロックが渡された場合、2つのハッシュに同じキーがあった際に実行され、ブロックを評価した値が使用されます。
サンプル:
h = {:a=>"a", :b=>{ :aa=>"aa" }, :c=>"c" } h2 = {:x=>"x", :b=>{ :bb=>"bb" }, :c=>"c" } # ブロックなしでマージ。競合した場合、引数側の値が使用される。 p h.merge( h2 ) puts "---" # ブロック付きでマージ。競合した場合、ブロックが実行されその結果が使用される。 p h.merge( h2 ) { |key, self_val, othe_val| puts "conflict: " << key.to_s "conflict" }
出力:
{:b=>{:bb=>"bb"}, :c=>"c", :x=>"x", :a=>"a"} --- conflict: b conflict: c {:b=>"conflict", :c=>"conflict", :x=>"x", :a=>"a"}
余談
最初次のように書いていてはまりました。
def merge( h, h2 ) return h.merge( h2 ) { |key, self_val, othe_val| return "conflict" } end p merge( h2, h2 )
出力:
"conflict"
関数化をやめると原因がわかります。
p h.merge( h2 ) { |key, self_val, othe_val| return "conflict" }
出力:
xxx/hash_merge.rb:22: unexpected return (LocalJumpError)