一个教程有这个代码块:什么是块变量捕获?
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]
但它实际上只是让我更加困惑。为什么一个变量捕获密钥,而其他变量则捕获两个不同的值?
我是很新的红宝石(和爱它),这似乎是在它需要的键一个接一个,如果有重复它采用了第二珍藏价值的第一种情况下。在第二种情况下,它会执行相同的操作,但会采用第一个集合(旧)的值。什么似乎混淆你的是,h1.merge()不修改H1,它返回一个新的对象。红宝石是真棒:)尽请注意,我不是100%肯定,如此评论,并希望有人能答对更好(或批准这个答案,让我开心:d) – 2012-10-04 13:27:32