0

一个教程有这个代码块:

h1 = ["a" => 111, "b" => 222]
h2 = ["b" => 333, "c" => 444]
h1.merge(h2) {|key, old, new| new}
# => ["a" => 111, "b" => 333, "c" => 444]
h1.merge(h2) {|key, old, new| old}
# => ["a" => 111, "b" => 222, "c" => 444]

我们与合并有冲突。我们的两个数组中有两个重复的键。new正在捕获h2的值"b",并输出它会强制它在合并中优先。同样,old正在捕获h1的值"b",并强制它优先。

为什么我们似乎只获取 的值"b"?变量不应该抓取整个数组吗?块变量在使用时是否与上下文相关并改变功能,.merge而不是说,.times?或者当我们处理数组而不是简单的数字时,它们会改变函数吗?还是他们看到了合并冲突并且就像“我们必须抓住冲突点”?我想也许试着看看里面有什么key会有所帮助,

h1.merge(h2) {|key, old, new| key}
# => ["a" => 111, "b" => "b", "c" => 444]

但它实际上只是让我更加困惑。为什么一个变量捕获键,而其他变量捕获两个不同的值?

4

3 回答 3

2

它正在合并:在 中h1.merge(h2),'h1' 是“旧”哈希,而 'h2' 是“新”哈希。只有在两个哈希中都有值的键才会调用该块。该块有 3 个参数:每个键和来自每个散列的相应值。块中的逻辑选择将哪个放入该键的输出哈希中。任何仅在一个散列中的键都会直接进入输出而不通过块进行处理。

通过运行,您可能会更好地了解发生了什么

 h1.merge(h2){|key,left,right| print "k=#{key} l=#{left} r=#{right} "}

来自Ruby-Doc.org的描述:

返回包含 other_hash 内容和 hsh 内容的新哈希。如果未指定块,则具有重复键的条目的值将是 other_hash 的值。否则,每个重复键的值是通过调用具有该键的块、其在 hsh 中的值和其在 other_hash 中的值来确定的。

因此,要回答您的一个具体问题,是的,该块是有条件地调用的,仅针对冲突的键,这与为每个键调用的 .each 或 .delete_if 等方法不同。

于 2012-10-04T13:29:51.880 回答
1

我建议您研究块和块变量如何在 ruby​​ 中工作,因为我认为这就是让您感到困惑的原因。

例如,此资源可能会很有帮助。

于 2012-10-04T13:40:21.923 回答
0

merge的文档中。三个参数key, old, new是这样使用的:

  • 如果key仅存在于其中一个哈希中,则该哈希中的值用于构建合并
  • 如果key在两个哈希中都存在,则返回来自 proc(块)的返回值{|key, old, new| key },在这种情况下是key要插入哈希中的键。

您可以执行其他操作,例如{|key, old, new| old - new }在两个哈希之间存在密钥冲突时调用计算。这是合并文档中的一个示例:

h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge(h2)   #=> {"a"=>100, "b"=>254, "c"=>300}
h1.merge(h2){|key, oldval, newval| newval - oldval}
               #=> {"a"=>100, "b"=>54,  "c"=>300}
于 2012-10-04T13:34:03.847 回答