Ruby 3.4 リファレンスマニュアル

instance method Hash#merge!

merge!(*others) -> self[permalink][rdoc][edit]
merge!(*others) {|key, self_val, other_val| ... } -> self
update(*others) -> self
update(*others) {|key, self_val, other_val| ... } -> self

selfとothersのハッシュの内容を順番にマージ(統合)します。

デフォルト値はselfの設定のままです。

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

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

[PARAM] others:
マージ用のハッシュまたはメソッド to_hash でハッシュに変換できるオブジェクトです。
[RETURN]
マージ後のselfを返します。
h1 = { "a" => 100, "b" => 200 }
p h1.merge!        # => {"a" => 100, "b" => 200}
p h1               # => {"a" => 100, "b" => 200}
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 246, "c" => 300 }
p h1.merge!(h2)    # => {"a" => 100, "b" => 246, "c" => 300}
p h1               # => {"a" => 100, "b" => 246, "c" => 300}
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 246, "c" => 300 }
h3 = { "b" => 357, "d" => 400 }
p h1.merge!(h2, h3)  # => {"a" => 100, "b" => 357, "c" => 300, "d" => 400}
p h1               # => {"a" => 100, "b" => 357, "c" => 300, "d" => 400}
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 246, "c" => 300 }
h3 = { "b" => 357, "d" => 400 }
p h1.merge!(h2, h3) {|key, v1, v2| v1 }
                   # => {"a" => 100, "b" => 200, "c" => 300, "d" => 400}
p h1               # => {"a" => 100, "b" => 200, "c" => 300, "d" => 400}
foo = {1 => 'a', 2 => 'b', 3 => 'c'}
bar = {2 => 'B', 3 => 'C', 4 => 'D'}

p foo.update(bar) # => {1 => "a", 2 => "B", 3 => "C", 4 => "D"}
p foo  # => {1 => "a", 2 => "B", 3 => "C", 4 => "D"}

p foo.update(bar) {|key, foo_val, bar_val| foo_val + bar_val } # => {1 => "a", 2 => "BB", 3 => "CC", 4 => "DD"}
p foo  # => {1 => "a", 2 => "BB", 3 => "CC", 4 => "DD"}

[SEE_ALSO] Hash#merge,Hash#replace