2013-05-22 4 views
14

Существует Enumerator#feed method, я обнаружил случайно. Она определяется как:Магия Enumerator # feed

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

Я изучил примеры и мысли »яй«, это должно работать, используя 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, чтобы я мог обвести вокруг него голову?

ответ

6
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.

+1

Пожалуйста, включите некоторый контекст в пост. Ответы на StackOverflow не должны быть «[чуть больше, чем ссылка на внешний сайт] (http://stackoverflow.com/faq#deletion)» – Gareth

+0

@Gareth. Все в порядке? или больше контекста, который мне нужно добавить? Я думаю, что то, что я там написал, это все о 'enum # feed'. –

+0

@Priti, мне очень нравится пример «карты!» - спасибо. Все еще надеюсь получить больше ответов с большим количеством примеров. В настоящее время «feed», кажется, бесполезен в «реальном мире». – tessi

0

В качестве дополнения, из current docs for Ruby v2.5:

# Array#map passes the array's elements to "yield" and collects the 
# results of "yield" as an array. 
# Following example shows that "next" returns the passed elements and 
# values passed to "feed" are collected as an array which can be 
# obtained by StopIteration#result. 
e = [1,2,3].map 
p e.next   #=> 1 
e.feed "a" 
p e.next   #=> 2 
e.feed "b" 
p e.next   #=> 3 
e.feed "c" 
begin 
    e.next 
rescue StopIteration 
    p $!.result  #=> ["a", "b", "c"] 
end