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

Mar*_*ino 13 ruby

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

(1..4).inject(&:+)
Run Code Online (Sandbox Code Playgroud)

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

(1..4).inject(0) {|a,n| a + n}
Run Code Online (Sandbox Code Playgroud)

但它究竟是如何运作的呢?

为什么&:+和写块一样{|a,n| a + n}

为什么它不需要初始值?我很好,正常值为0,但(1..4).inject(&:*)也有效,初始值必须为1 ...

ada*_*max 14

来自Ruby文档:

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

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

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

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

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


归档时间:

查看次数:

2603 次

最近记录:

14 年,5 月 前