4

我最近遇到了这个问题:
我一直像这样使用注入(我知道 (0) 部分是可选的,可以省略)

array = [13,23,13]
#=> [13, 23, 13]
array.inject(0) { |sum,i| sum+i }
#=> 49

偶然我发现你可以使用:

array.inject(:+)
#=> 49
array.inject(:-)
#=> -23
array.inject(:*)
#=> 3887
array.inject(:/)
#=> 0

谷歌搜索这个问题,我发现了一篇关于 inject 的好文章,但没有提到我尝试过的内容......
谁能向我解释或提供一些关于我刚刚使用的注入命令的信息?

4

1 回答 1

6

从文档上Enumerable#inject

...如果您指定一个符号,那么集合中的每个元素都将传递给 memo 的命名方法。无论哪种情况,结果都会成为 memo 的新值。在迭代结束时,memo 的最终值就是方法的返回值。

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

因此,如果您指定一个符号,它会将其视为方法名称,并在可枚举的每个元素上调用此方法,替换上面所述的 memo。现在,数学运算符 (+-*/) 只是方法,没有别的。这些行产生相同的结果:

13 + 23 # => 36
13.+(23) # => 36
13.send(:+, 23) # => 36

当您将符号传递给injectreduce它使用第三种形式将该运算符动态应用于元素时:

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

此速记也可以与运算符以外的方法一起使用:

[{"a"=>1}, {"b"=>2}].inject(:merge) # => {"a"=>1, "b"=>2} 
于 2013-01-25T16:49:38.743 回答