Ruby #inject行为与文档不同

时间:2016-11-30 02:43:28

标签: ruby inject enumerable

看看Ruby documentation on Enumerable class我发现了一些有趣的东西,我想知道为什么会这样。

#inject description我找到了这些例子:

# Sum some numbers
(5..10).reduce(:+)                             #=> 45
# Same using a block and inject
(5..10).inject { |sum, n| sum + n }            #=> 45
# Multiply some numbers
(5..10).reduce(1, :*)                          #=> 151200
# Same using a block
(5..10).inject(1) { |product, n| product * n } #=> 151200

请注意,当#inject用于乘法时,它会收到初始值1.我认为这是必要的,因为否则产品将接收0作为起始值(因为它发生在总和中)并且乘法将也是0.事实上,如果我跑

p (1..5).inject(0) { |prod, n| prod * n } 

我得到了

0

然后我跑

p (1..5).inject { |sum, n| sum + n } 
p (1..5).inject { |prod, n| prod * n } 

得到了

15
120

我的问题是:

a)为什么文档将此1作为初始值包含在实际上不需要的时候?

b)初始化正在注入的对象时#inject的行为是什么?

1 个答案:

答案 0 :(得分:8)

回答你的第一个问题:

a)为什么文档将此1作为初始值包含在实际上不需要的时候?

注入不会从apidock

中取1作为初始值
  

如果没有明确指定备忘录的初始值,则使用集合的第一个元素作为备忘录的初始值。

第二个问题的答案在于第一个问题的答案,因为它将对象初始化为应用了注入的数组的第一个元素。