14

更新コード:

irb(main):001:0> h1 = { "a" => 100, "b" => 200 }
=> {"a"=>100, "b"=>200}
irb(main):002:0> h2 = { "b" => 254, "c" => 300 }
=> {"b"=>254, "c"=>300}
irb(main):003:0> h1.update(h2)
=> {"a"=>100, "b"=>254, "c"=>300}

マージ コード:

irb(main):001:0> h1 = { "a" => 100, "b" => 200 }
=> {"a"=>100, "b"=>200}
irb(main):002:0> h2 = { "b" => 254, "c" => 300 }
=> {"b"=>254, "c"=>300}
irb(main):003:0> h1.merge(h2)
=> {"a"=>100, "b"=>254, "c"=>300}
irb(main):004:0>

上記mergeupdateメソッドを同じで実行しましたhash。しかし、同じ出力が得られました。ここで私の質問は次のとおりです。同じロジックupdateで動作しますか? merge同じでない場合、それらの出力はどのように同じになったのですか?

4

4 に答える 4

26

とは同じロジックupdateで動作しますか?merge

いいえ、それらは同じではありません。は、のインプレース バリアントであるupdateのエイリアスですmerge!merge

同じでない場合、それらの出力はどのように同じになったのですか?

ただし、どちらの場合も呼び出しの戻り値を使用しているため、の値はh1それぞれの場合で異なります。

h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.update(h2)
h1  #=> { "a" => 100, "b" => 254, "c" => 300 }

h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge(h2)
h1  #=> { "a" => 100, "b" => 200 }
于 2013-01-13T19:08:33.113 に答える
3

Hash#updatehttp://ruby-doc.org/core-1.9.3/Hash.html#method-i-updateのエイリアスですHash#merge!

于 2013-01-13T19:06:20.057 に答える
2

Hash#update は Hash#merge のエイリアスです!

Hash#merge と Hash#update の違いは、 Hash#update がキー/値をインプレースで更新するのに対し、 Hash#mergeは呼び出し元のインスタンスに触れずに更新されたハッシュを返すことです。

于 2013-01-13T19:09:43.447 に答える
1

h1.update(h2) - h1 インスタンスを更新 - 更新された h1 を返します。h1.merge(h2) - h1 を残し、更新されたコピーを作成します - h1 の更新されたコピーを返します (h3 と呼ぶことができます)

于 2019-12-29T17:35:34.940 に答える