2013-05-22 6 views
14

Es gibt diese Enumerator#feed method, die ich zufällig entdeckt habe. Es ist wie folgt definiert:Die Magie von Enumerator # feed

Feed obj → nil
Setzt den Wert der nächsten Ertrag innerhalb e zurückgegeben werden. Wenn der Wert nicht festgelegt ist, gibt die Ausbeute null zurück. Dieser Wert wird gelöscht, nachdem er zurückgegeben wurde.

studierte ich die Beispiele und dachte »Yay«, sollte diese feed mit arbeiten:

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

Aber es funktioniert nicht. Ich nehme an, es gibt 'dog' nicht zurück, weil each intern yield nicht verwendet.

Die Sache ist, dass ich keine realen Anwendungsfälle aus dem angegebenen Beispiel in der Dokumentation ableiten konnte, Google ist kein Freund mit dieser Frage, und (von dem, was ich versucht habe) feed scheint nicht zu funktionieren gut mit den anderen Enumerator/Enumeration Methoden.

Können Sie mir bitte ein gutes Beispiel geben, das erklärt feed, so kann ich meinen Kopf herumkommen?

Antwort

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 

wie Sie sehen können, wirkt sich Futter das Ergebnis der Ausbeute, aber die enumerator Methode müssen mit sich darum kümmern

nun das Beispiel sehen Ihrer besitzt:

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

Der Weg feed funktioniert:

zuerst müssen Sie als nächstes dann rufen Sie Feed rufen Sie den Wert zu setzen, und dann der nächste Aufruf des nächsten gilt die Änderung (auch wenn es ein StopIteration error erhöhen.)

Weitere Erklärung Blick am Thread hier: Enum#feed:. Dies hat die richtige Erklärung über enum#feed.

+1

Bitte geben Sie einigen Kontext in der Post. Die Antworten zu StackOverflow sollten nicht "[kaum mehr als ein Link zu einer externen Site] sein" (http://stackoverflow.com/faq#deletion) – Gareth

+0

@Gareth Ist es in Ordnung? oder mehr Kontext muss ich hinzufügen? Ich denke, was ich dort geschrieben habe, dreht sich alles um das 'enum # feed'. –

+0

@Priti, ich mag das 'map!' Beispiel sehr - danke. Ich hoffe immer noch mehr Antworten mit mehr Beispielen zu bekommen. Derzeit scheint "feed" in der "echten Welt" ziemlich nutzlos zu sein. – tessi

0

Als Nachtrag vom 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