为什么Ruby注入不返回枚举器?

时间:2015-02-06 05:46:43

标签: ruby enumerable

我期待Enumerable#inject会像其他方法一样返回一个枚举器并将其传递给一个块;但这是投掷错误。在pry中尝试了以下内容:

>> numbers = (1..12)
=> 1..12
>> numbers.each_with_index
=> #<Enumerator: ...>
>> numbers.each_with_index.map
=> #<Enumerator: ...>
>> numbers.inject(0)
TypeError: 0 is not a symbol
from (pry):18:in `inject'

我原本期望按如下方式使用它:

numbers = (1..12)
block = lambda { |sum, digit| sum + digit }

numbers.inject(0) { |sum, digit| sum + digit } # => 78
numbers.each_with_index.map &block # => [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23]
numbers.inject(0) &block # => 0 is not a symbol (TypeError)

这样的实施有什么理由吗?

2 个答案:

答案 0 :(得分:5)

从概念上讲,Enumerator是一种集合。 Enumerable#inject在一个集合的成员中累积一个值,它返回Enumerator毫无意义。

您可以将numbers.inject(0) &block更改为:

来完成工作
numbers.inject(0, &block)

答案 1 :(得分:1)

inject这样的方法的重点是根据枚举器返回一些计算值。如果他们总是返回一个枚举器,那么就没有任何有意义的用法。当块不存在时它返回枚举器的原因是让你通过修改接收器来创建一个新的枚举器。但这不应该是最终目标;你只创建一个枚举器,这样你最终可以根据它计算一些东西。