Подтвердить что ты не робот

Магия Enumerator # feed

Существует этот метод # перечисления # перечислителя, который я обнаружил случайно. Он определяется как:

feed obj → nil
Устанавливает значение, возвращаемое следующим выходом внутри e. Если значение не задано, доходность возвращает nil. Это значение очищается после сдачи.

Я изучил примеры и подумал "Yay!", это должно работать с помощью feed:

enum = ['cat', 'bird', 'goat'].each # creates an enumerator
enum.next #=> 'cat'
enum.feed 'dog'
enum.next #=> returns 'bird', but I expected 'dog'

Но это не сработает. Я предполагаю, что он не возвращает 'dog', потому что each не использует yield внутренне.

Дело в том, что из приведенного примера в документации я не мог вывести случаи использования в реальном мире, Google не является другом с этим вопросом, и (из того, что я пробовал) feed, похоже, не хорошо работают с другими методами Enumerator/Enumeration.

Можете ли вы, пожалуйста, дать мне хороший пример, который объясняет feed, так что я могу обойти его вокруг?

4b9b3361

Ответ 1

def meth
 [1,2,3].each {|e| p yield(e)}
end

m = to_enum(:meth)
m.next #=> 1

m.feed "e"

m.next
#printed: "e"
#return => 2

, как вы можете видеть, питание влияет на результат урожая, НО перечислитель метод должен заботиться о нем

Теперь посмотрим пример вашего:

a = ['cat', 'bird', 'goat']
m = a.to_enum(:map!)
m.next
m.feed("dog")
m.next
m.next
p a #=> ["dog", nil, "goat"]

Работает feed:

сначала вам нужно позвонить дальше, затем вы вызываете канал, чтобы установить значение, а затем следующий вызов следующего применит изменение (даже если оно поднимет StopIteration error.)

Подробнее см. здесь: Enum#feed:. Это имеет правильное объяснение о enum#feed.