Я ожидал, что Enumerable#inject
будет возвращать перечислитель, как и другие методы, и передавал ему блок; но это была ошибка. Пробовал следующее pry
:Почему Ruby не вводит возвратный счетчик?
>> 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'. Я вижу общность во всех них, в том числе «уменьшать/внедрять». –
Спасибо @CarySwoveland! Я довольно озадачен, почему они решили реализовать его так. Я почему-то не покупаю понятие о том, что его, потому что почти нет вариантов использования для его дальнейшего соединения. Я бы предположил, что согласованность могла бы быть лучше. –
«Перечислитель» вычисляется по одному значению за раз. Вы можете немного потянуть (вызывая «next»), и одно значение выпадает. Вы снова тянете, другое значение выпадает. 'inject' не может этого сделать. –