Ruby #inject行为与文档不同

Ed *_*ida 4 ruby inject enumerable

看一下课上的Ruby文档,Enumerable我发现了一些有趣的内容,我想知道为什么会这样.

#inject描述中我发现了这些例子:

# 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
Run Code Online (Sandbox Code Playgroud)

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

p (1..5).inject(0) { |prod, n| prod * n } 
Run Code Online (Sandbox Code Playgroud)

我有

0
Run Code Online (Sandbox Code Playgroud)

但后来我跑了

p (1..5).inject { |sum, n| sum + n } 
p (1..5).inject { |prod, n| prod * n } 
Run Code Online (Sandbox Code Playgroud)

得到了

15
120
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

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

Sau*_*abh 8

回答你的第一个问题:

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

apidock注入不带1作为初始值:

如果没有为memo显式指定初始值,则使用collection的第一个元素作为memo的初始值.

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

  • 值得注意的是,通常一个默认值来处理空列表的情况通常是一个好主意:`[] .inject(:+)`返回`nil`,但是`[] .inject(0,: +)`返回`0`. (2认同)