看看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
的行为是什么?
答案 0 :(得分:8)
回答你的第一个问题:
a)为什么文档将此1作为初始值包含在实际上不需要的时候?
注入不会从apidock:
中取1作为初始值如果没有明确指定备忘录的初始值,则使用集合的第一个元素作为备忘录的初始值。
第二个问题的答案在于第一个问题的答案,因为它将对象初始化为应用了注入的数组的第一个元素。