我在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
由于
答案 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
}