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

时间:2010-08-11 05:58:10

标签: 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}

请解释一下它是如何运作的?

3 个答案:

答案 0 :(得分:6)

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

  # 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

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

答案 1 :(得分:3)

:+是表示添加消息的symbol。请记住,Ruby具有Smalltalk样式,通过向对象发送消息来执行几乎所有操作。

正如非常详细讨论here(1..100).inject(&:+)是早期版本中的有效语法,其中Rails已将to_proc扩展名添加到符号。

将符号传递给注入的功能在1.9和backported into 1.8.7中是新的。

答案 2 :(得分:1)

正如您所见in the docsinject可以取一个块(就像您熟悉的那样)或代表二元运算符名称的符号。对于已定义的操作,它是一个有用的简写。