注入减少
注入和减少是同一事物的不同名称。在其他语言中,这些函数通常称为折叠(如 foldl 或 foldr)。这些方法在每个 Enumerable 对象上都可用。
Inject 采用两个参数函数,并将其应用于 Array 中的所有元素对。
对于数组 [1, 2, 3]
,我们可以通过指定起始值和块来添加所有这些以及起始值零,如下所示:
[1,2,3].reduce(0) {|a,b| a + b} # => 6
在这里,我们将函数传递给一个起始值和一个块,表示将所有值一起添加。该块首先以 0
作为 a
而 1
作为 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