inject()在没有参数的情况下做什么

时间:2014-04-09 19:32:05

标签: ruby inject enumerable

我知道括号之间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?

主要是:如果没有参数,它会有什么不同的做法?

1 个答案:

答案 0 :(得分:4)

  

那么当你把它们抛弃时会发生什么?

然后在第一次传递中,xy将设置为您的收藏中的前2个值。从下一个传递开始,x将被设置为块返回的值,y将被设置为集合中的下一个元素。

在您的案例中,第一次传递xy分别设置为24

从下一个传递开始,x设置为nil,因为块中的最后一个语句是Kernel#puts,在打印传递给它的参数后返回nil 。但是y6,然后是8

#inject

  

如果您没有为备忘录明确指定初始值,那么集合的第一个元素将用作初始值备忘录的价值

根据代码,所有这些都是非常期待的。


现在假设您将初始值传递为 - 11 ,然后输出为: -

x: 11   y: 2
x:     y: 4
x:     y: 6
x:     y: 8

这里的解释相同 -

在这种情况下,第一次传递xy分别设置为112

从下一个传递开始,x设置为nil,因为块中的最后一个语句是Kernel#puts,在打印传递给它的参数后返回nil 。但是y4,然后6然后是8

注意: x:之后,当您什么都看不见时。为什么?由于nil.to_s为空字符串,即""