“(1..4).inject(&:+)”如何在Ruby中工作

我发现Ruby中的这段代码非常有趣

(1..4).inject(&:+) 

好的,我知道inject是什么,我知道这个代码基本上相当于

 (1..4).inject(0) {|a,n| a + n} 

但它究竟是如何运作的?

为什么&:+与编写块{|a,n| a + n} {|a,n| a + n}

为什么它不需要初始值? 我很好,正则值为0,但是(1..4).inject(&:*)也可以,并且初始值必须为1 …

来自Ruby文档 :

如果指定了符号,则集合中的每个元素都将传递给命名的备忘录方法

因此,指定符号相当于传递以下块: {|memo, a| memo.send(sym, a)} {|memo, a| memo.send(sym, a)}

如果没有为memo显式指定初始值,则使用collection的第一个元素作为memo的初始值。

因此,没有魔力,Ruby只需将第一个元素作为初始值并从第二个元素开始注入。 您可以通过编写[].inject(:+)来检查它:它返回nil而不是[].inject(0, :+)返回0。

编辑:我没注意到&符号。 你不需要它, inject将使用符号。 但是如果你写它,符号将转换为块,它可以用于其他方法