2013-05-22 6 views
14

Jest to Enumerator#feed method, odkryłem przez przypadek. Jest ona definiowana jako:Magia Enumerator # RSS

paszy obj → zero
ustawia wartość jest zwracana przez następne wydajnością e wewnątrz. Jeśli wartość nie jest ustawiona, wydajność zwraca zero. Ta wartość jest czyszczona po uzyskaniu.

Uczyłem przykłady i myśli »Yay«, to powinno działać przy użyciu feed:

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

Ale to nie działa. Zakładam, że nie powraca 'dog', ponieważ each nie korzysta wewnętrznie z yield.

Chodzi o to, że nie mogłem wydedukować żadnych przypadków użycia rzeczywistego świata z podanego przykładu w dokumentacji, Google nie jest przyjacielem z tym pytaniem i (z tego, co próbowałem) wydaje się, że nie działa feed dobrze z innymi metodami Enumerator/Enumeration.

Czy możesz podać mi dobry przykład, który wyjaśnia feed, więc mogę o tym myśleć?

Odpowiedz

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 

jak widać, paszy wpływa na wynik plonu, ale metoda wyliczający trzeba dbać o nią

Teraz patrz przykład z listy posiada:

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

Sposób działania feed działa:

najpierw trzeba zadzwonić obok następnie zadzwonić feed, aby ustawić wartość, a następnie kolejna rozmowa z przyszłym ma zastosowania zmian (nawet jeśli zgłosi StopIteration error.)

Dalsze wyjaśnienie wygląd w wątku tutaj: Enum#feed:. To ma odpowiednie objaśnienie na temat enum#feed.

+1

Proszę podać jakiś kontekst w poście. Odpowiedzi na StackOverflow nie powinny być "[ledwie więcej niż link do strony zewnętrznej] (http://stackoverflow.com/faq#deletion)" – Gareth

+0

@Gareth Czy wszystko w porządku? lub więcej kontekstu muszę dodać? Myślę, że to, co tam napisałem, dotyczy "kanału informacyjnego". –

+0

@Priti, Bardzo podoba mi się przykład 'map!' - dziękuję. Nadal mam nadzieję uzyskać więcej odpowiedzi z większą ilością przykładów. Obecnie 'feed' wydaje się całkiem bezużyteczny w" prawdziwym świecie ". – tessi

0

Jako aneksu, z 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