Rubyリファレンス: Home

merge, merge! (Hash)

Edit   History

標準クラス・モジュール > Hash > merge, merge!

hash.merge(other_hash)

mergeメソッドは、2つのハッシュを統合します。レシーバhashと引数other_hashのキーと値を集め、新しいハッシュに入れて返します。重複するキーがあるときは、other_hashの値が使われます。

image1 = { :src => "monkey.jpg", :alt => "monkey" }
image2 = { :width => 320, :height => 240 }
image3 = image1.merge(image2)
puts image3[:src], image3[:width]
monkey.jpg
320
hash.merge(other_hash) {|key, oldval, newval| block }

mergeメソッドにブロックを渡すと、重複するキーがあるときにどの値を使うか決められます。ブロック引数にはキーkey、レシーバでのキーの値oldval、引数でのキーの値newvalが入ります。ブロックの戻り値がキーの値になります。

次の例では、:src:altの値はimage1のものを使い、それ以外のキーの値はimage2のものを使うようにしています。

image1 = { :src => "monkey.jpg", :alt => "monkey",
           :width => 320, :height => 240 }
image2 = { :src => "pelican.jpg", :alt => "pelican",
           :width => 640, :height => 480 }
image3 = image1.merge(image2) do |key, oldval, newval|
  [:src, :alt].include?(key) ? oldval : newval
end
puts image3[:src], image3[:width]
monkey.jpg
640
hash.merge!(other_hash)
hash.merge!(other_hash) {|key, oldval, newval| block }

merge!メソッドは、レシーバhashの内容に引数other_hashの内容を加えます。レシーバ自身を変更するメソッドです。戻り値はレシーバ自身です。

updateメソッドは、merge!の別名です。

image = { :src => "monkey.jpg", :alt => "monkey" }
image.merge!(:width => 320, :height => 240)
puts image[:src], image[:width]
monkey.jpg
320

重複するキーがあるときは、other_hashの値で上書きします。ブロックを渡すと、どちらの値を使うかを決められます。

image1 = { :src => "monkey.jpg", :alt => "monkey",
           :width => 320, :height => 240 }
image2 = { :src => "pelican.jpg", :alt => "pelican",
           :width => 640, :height => 480 }
image1.merge!(image2) do |key, oldval, newval|
  [:src, :alt].include?(key) ? oldval : newval
end
puts image1[:src], image1[:width]
monkey.jpg
640

関連項目