如果我在注入块中使用'p'函数,则减少/注入错误

时间:2012-01-28 13:06:26

标签: ruby

我在irb中输入以下代码:

(1..5).reduce([]){|a,b| p a,b }

预期结果将是:

[]
1
[]
2
[]
3
[]
4
[]
5
=> []

由于我在任何时候都没有修改inject的返回值为[]

但由于奇怪的原因,我得到了这个:

[]
1
[[], 1]
2
[[[], 1], 2]
3
[[[[], 1], 2], 3]
4
[[[[[], 1], 2], 3], 4]
5
=> [[[[[[], 1], 2], 3], 4], 5]

为什么inject的返回值在我甚至没有更改时从最初修改?请有人请点亮它。

我正在使用MRI 1.9.2

由于

1 个答案:

答案 0 :(得分:6)

Enumerable#reduce执行以下操作:它遍历可枚举中的每个元素,并将其作为块的第二个参数传递。第一个参数是块为前一个项返回的值。 reduce参数(在您的情况下为[])作为第一个块调用的第一个块参数传递(在文档中称为 initial 值)。

p打印结果并返回其参数的值。该值作为第一个参数传递给下一个块调用,因为p调用是块中的最后一个表达式,它被认为是该块的返回值。

为了获得预期结果,从块中返回块的第一个参数:

(1..5).reduce([]) { |a,b| 
  p a,b
  a # then the first block argument will be the same for each block call 
}