这种红宝石注射魔法是如何起作用的?

Zif*_*ong 5 ruby

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

[1,2,3,4,5,6,7].inject(:+)  
Run Code Online (Sandbox Code Playgroud)

=> 28

[1,2,3,4,5,6,7].inject(:*)  
Run Code Online (Sandbox Code Playgroud)

=> 5040

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

[1,2,3,4,5,6,7].inject {|sum, x| sum + x}
Run Code Online (Sandbox Code Playgroud)

请解释它是如何工作的?

Nik*_*bak 6

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

  # enum.inject(initial, sym) => obj
  # enum.inject(sym)          => obj
  # enum.inject(initial) {| memo, obj | block }  => obj
  # enum.inject          {| memo, obj | block }  => obj
Run Code Online (Sandbox Code Playgroud)

我们的情况是第二个.

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

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

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