注入减少

注入和减少是同一事物的不同名称。在其他语言中,这些函数通常称为折叠(如 foldl 或 foldr)。这些方法在每个 Enumerable 对象上都可用。

Inject 采用两个参数函数,并将其应用于 Array 中的所有元素对。

对于数组 [1, 2, 3],我们可以通过指定起始值和块来添加所有这些以及起始值零,如下所示:

[1,2,3].reduce(0) {|a,b| a + b} # => 6

在这里,我们将函数传递给一个起始值和一个块,表示将所有值一起添加。该块首先以 0 作为 a1 作为 b 然后将其结果作为下一个 a 运行,因此我们将 1 添加到第二个值 2。然后我们取结果(3)并将其添加到列表中的最后一个元素(也是 3),给出我们的结果(6)。

如果省略第一个参数,它会将 a 设置为列表中的第一个元素,因此上面的示例与:

[1,2,3].reduce {|a,b| a + b} # => 6

此外,我们可以将命名函数作为符号传递,而不是传递具有函数的块,而不是使用起始值。有了这个,上面的例子可以写成:

[1,2,3].reduce(0, :+) # => 6

或省略起始值:

[1,2,3].reduce(:+) # => 6