我知道括号之间inject()
的参数是可选的,那么当你把它们排除在外时会发生什么?例如:
[2, 4, 6, 8].inject{ |x, y|
puts "x: #{x} y: #{y}"
}
输出以下内容:
x: 2 y: 4
x: y: 6
x: y: 8
为什么x从2开始?不应该从零开始吗?为什么只有3行输出而不是4?
主要是:如果没有参数,它会有什么不同的做法?
答案 0 :(得分:4)
那么当你把它们抛弃时会发生什么?
然后在第一次传递中,x
,y
将设置为您的收藏中的前2个值。从下一个传递开始,x
将被设置为块返回的值,y
将被设置为集合中的下一个元素。
在您的案例中,第一次传递x
和y
分别设置为2
和4
。
从下一个传递开始,x
设置为nil
,因为块中的最后一个语句是Kernel#puts
,在打印传递给它的参数后返回nil
。但是y
是6
,然后是8
。
如果您没有为备忘录明确指定初始值,那么集合的第一个元素将用作初始值备忘录的价值。
根据代码,所有这些都是非常期待的。
现在假设您将初始值传递为 - 11 ,然后输出为: -
x: 11 y: 2
x: y: 4
x: y: 6
x: y: 8
这里的解释相同 -
在这种情况下,第一次传递x
和y
分别设置为11
和2
。
从下一个传递开始,x
设置为nil
,因为块中的最后一个语句是Kernel#puts
,在打印传递给它的参数后返回nil
。但是y
是4
,然后6
然后是8
。
注意: x:
之后,当您什么都看不见时。为什么?由于nil.to_s
为空字符串,即""
。