array.inject(:+)如何工作?

时间:2014-06-07 05:05:41

标签: ruby-on-rails ruby

我知道hash.map(&:key)函数就像hash.map {| element | element.key}因为它在符号:key上调用to_proc。

但是为什么array.inject(:+)与array.inject {| sum,x |相同sum + x}?

谢谢。

2 个答案:

答案 0 :(得分:0)

array.inject(:+)

在ruby inject方法中,当没有传入任何块时,它会查看第一个参数是否为要使用的方法的符号(即:+)。在这种情况下,它会将:+识别为符号,并知道它需要对整个列表求和。

可以使用

array.inject(&:+)

首先调用to_proc,效率稍低。

您可能想要使用

array.inject(0, :+)

在数组长度为0的情况下返回0(而不是nil)。在这种情况下,您的第一个参数不是符号,因此Ruby将查看要使用的方法的第二个参数。

答案 1 :(得分:0)

inject的唯一参数不是符号时,它将用作初始值,否则to_proc&将应用于参数,并用作一个街区。当有两个参数时,第一个参数用作初始值,第二个参数必须是符号,并且将用于创建如上所述的块。

这样做的一个缺点是你不能使用符号作为inject的初始值,但可能认为没有用例。我不认为这个规范是干净的。