我最近碰到了这个问题:
我总是这样使用注入(我知道(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
在Google上搜索我发现了一个不错的article on inject,但没有提及我尝试过的内容....
任何人都可以向我解释或提供一些关于我刚刚使用的注入命令的信息吗?
答案 0 :(得分:6)
来自Enumerable#inject
上的文档:
...如果您改为指定符号,则集合中的每个元素都将传递给命名的备忘录方法。在任何一种情况下,结果都将成为备忘录的新值。在迭代结束时,memo的最终值是方法的返回值。
如果没有明确指定备忘录的初始值,则使用集合的第一个元素作为备忘录的初始值。
因此,如果指定一个符号,它会将其视为方法名称,并在可枚举的每个元素上调用此方法,如上所述替换备忘录。现在,数学运算符(+ - * /)只是方法,没有别的。这些行产生相同的结果:
13 + 23 # => 36
13.+(23) # => 36
13.send(:+, 23) # => 36
当您将符号传递给inject
或reduce
时,它会使用第三种形式将该运算符动态应用于元素:
[1,2,3].inject(:+) # => 6
此简写也可以与运算符以外的方法一起使用:
[{"a"=>1}, {"b"=>2}].inject(:merge) # => {"a"=>1, "b"=>2}