【发布时间】:2015-02-06 14:26:48
【问题描述】:
我期待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)
这样的实现有什么原因吗?
【问题讨论】:
-
好问题。我以前没有考虑过。请注意,有很多
Enumerable方法可以使用一个块,但在没有给出枚举数时不返回枚举数。其他包括count、max、min、minimax、none?one?和sort。我看到了他们所有人的共同点,包括reduce/inject。 -
感谢@CarySwoveland!我很困惑他们为什么选择这样实现它。我不相信它的概念,因为几乎没有进一步链接它的用例。我建议一致性可能会更好。
-
Enumerator一次计算一个值。你可以拉一点(通过调用next)并且一个值会掉出来。您再次拉动,另一个值会掉出来。inject做不到。 -
@JörgWMittag 哇,这是一个完美的解释。谢谢!
-
四点,Jikku:1) 如果
reduce返回了一个枚举器,并且您想对一个数组的值求和,总计7,您会返回[7].to_enum,在这种情况下您必须标记.next才能检索它? (7.to_enum不起作用,因为数字类没有each.) 2)如果您需要返回枚举数,您可以经常使用其他方法,例如each_with_object作为reduce的替代品; (续)
标签: ruby enumerable