kind=defined
names=merge,merge!
visibility=public

--- merge(other) -> Hash
--- merge(other) {|key, self_val, other_val| ... } -> Hash
--- merge!(other) -> self
--- merge!(other) {|key, self_val, other_val| ... } -> self

selfとotherのハッシュの内容をマージ(統合)した結果を返します。デフォルト値はselfの設定のままです。

self と other に同じキーがあった場合はブロック付きか否かで
判定方法が違います。ブロック付きのときはブロックを呼び出して
その返す値を重複キーに対応する値にします。ブロック付きでない
場合は常に other の値を使います。

Hash#merge! は、マージの結果でselfを変更する破壊的メソッドで、[[m:Hash#update]] の別名です。

otherがハッシュではない場合、otherのメソッドto_hashを使って暗黙の変換を試みます。

@param other マージ用のハッシュまたはメソッド to_hash でハッシュに変換できるオブジェクトです。
@return マージした結果を返します

  foo = {1 => 'a', 2 => 'b', 3 => 'c'}
  bar = {2 => 'B', 3 => 'C', 4 => 'D'}
  
  p foo.merge(bar) #=> {1=>"a", 2=>"B", 3=>"C", 4=>"D"}
  p foo  #=> {1=>"a", 2=>"b", 3=>"c"}
  
  p foo.merge!(bar) {|key, foo_val, bar_val| foo_val + bar_val } #=> {1=>"a", 2=>"bB", 3=>"cC", 4=>"D"}
  p foo  #=> {1=>"a", 2=>"bB", 3=>"cC", 4=>"D"}
  
  class Foo
    def to_hash
      {:Australia => 'Sydney',
       :France => 'Paris'
       }
    end
  end
  
  h = {:Germany => 'Berlin',
       :Australia => 'Canberra',
       :France => 'Paris'
       }
  h.merge!(Foo.new) #暗黙の変換
  p h #=> {:Germany=>"Berlin", :Australia=>"Sydney", :France=>"Paris"}

@see [[m:Hash#update]],[[m:Hash#replace]]

