gpt4 book ai didi

Ruby #inject 行为与文档不同

转载 作者:数据小太阳 更新时间:2023-10-29 07:25:30 26 4
gpt4 key购买 nike

看看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)对象时,#inject 的行为是什么?

最佳答案

回答你的第一个问题:

a) 为什么文档将这个 1 作为初始值,而实际上并不需要它?

inject 不以1为初始值,来自apidock :

If you do not explicitly specify an initial value for memo, then uses the first element of collection is used as the initial value of memo.

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

关于Ruby #inject 行为与文档不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40879373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com