这种ruby注射魔法是如何工作的?

我今天看到了一个ruby代码片段。

[1,2,3,4,5,6,7].inject(:+) 

=> 28

 [1,2,3,4,5,6,7].inject(:*) 

=> 5040

这里的注射与我之前看到的完全不同,比如

 [1,2,3,4,5,6,7].inject {|sum, x| sum + x} 

请解释它是如何工作的?

没有魔力,符号(方法)只是可能的参数之一。 这是来自文档:

  # enum.inject(initial, sym) => obj # enum.inject(sym) => obj # enum.inject(initial) {| memo, obj | block } => obj # enum.inject {| memo, obj | block } => obj 

我们的情况是第二个。

您也可以使用传统块重写它:

 op = :+ # parameter of inject call [1,2,3,4,5,6,7].inject {|sum, x| sum.send(op, x)} # also returns 28 

(回答“它是如何工作的”部分)

:+是表示添加消息的符号 。 请记住,Ruby具有Smalltalk样式,其中几乎每个操作都是通过向对象发送消息来执行的。

正如这里详细讨论的那样, (1..100).inject(&:+)是早期版本中的有效语法,其中Rails已将to_proc扩展添加到Symbol。

将符号传递给注入的能力在1.9中是新的,并且向后移植到1.8.7 。

正如您在文档中看到的那样 , inject可以采用一个块(就像您熟悉的那样)或表示二元运算符名称的符号。 对于已定义的操作,它是一个有用的简写。