“(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
将使用符号。 但是如果你写它,符号将转换为块,它可以用于其他方法