gpt4 book ai didi

ruby - 如果我在注入(inject) block 中使用 'p' 函数,则减少/注入(inject)错误

转载 作者:数据小太阳 更新时间:2023-10-29 08:28:40 24 4
gpt4 key购买 nike

我在 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

谢谢

最佳答案

Enumerable#reduce执行以下操作:它遍历 enumerable 中的每个元素并将其作为 block 的第二个参数传递。第一个参数是 block 为前一个项目返回的值。 reduce 参数(在您的情况下为 [])仅作为第一个 block 调用的第一个 block 参数传递(在中称为 initial 值文档)。

p 打印结果并返回其参数值。此值作为第一个参数传递给下一个 block 调用,因为 p 调用是 block 中的最后一个表达式,它被视为此 block 的返回值。

为了获得预期的结果,从您的 block 中返回 block 的第一个参数:

(1..5).reduce([]) { |a,b| 
p a,b
a # then the first block argument will be the same for each block call
}

关于ruby - 如果我在注入(inject) block 中使用 'p' 函数,则减少/注入(inject)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9045446/

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