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>

merge我在相同的情况下运行了上述update方法hash。但是得到了相同的输出。所以我的问题是:是否使用相同updatemerge逻辑?如果不一样,那么输出如何相同?

4

4 回答 4

26

是否使用相同updatemerge逻辑?

不,它们不一样。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#updateHash#merge! http://ruby-doc.org/core-1.9.3/Hash.html#method-i-update的别名

于 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 回答