2013-05-22 14 views
14

C'è questo Enumerator#feed method, che ho scoperto per caso. Essa è definita come:La magia del feed n. Enumeratore

mangimi obj → nil
Imposta il valore da restituire il successivo rendimento interno e. Se il valore non è impostato, il rendimento ritorna nullo. Questo valore viene cancellato dopo essere stato ceduto.

ho studiato gli esempi e ho pensato »Yay«, questo dovrebbe funzionare utilizzando feed:

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

Ma non funziona. Presumo, non restituisce 'dog', perché each non utilizza yield internamente.

Il fatto è che non ho potuto dedurre alcun caso di utilizzo del mondo reale dall'esempio fornito nella documentazione, Google non è un amico con questa domanda e (da quello che ho provato) feed sembra non funzionare bene con gli altri metodi Enumerator/Enumeration.

Potete, per favore, darmi un buon esempio che spiega feed, quindi posso capirlo?

risposta

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 

come si può vedere, l'alimentazione influenza il risultato della resa, ma il metodo enumeratore bisogno di prendersi cura con esso

ora vedere l'esempio del vostro possiede:

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

Il modo in cui feed funziona:

prima è necessario chiamare il prossimo quindi si chiama alimentazione per impostare il valore, e quindi la prossima chiamata del prossimo si applica il cambiamento (anche se alzare un StopIteration error.)

Per ulteriori spiegazioni sguardo al thread qui: Enum#feed:. Questo ha la spiegazione corretta su enum#feed.

+1

Si prega di includere un contesto nel post. Le risposte su StackOverflow non devono essere "[poco più di un collegamento a un sito esterno] (http://stackoverflow.com/faq#deletion)" – Gareth

+0

@Gareth Va bene? o più contesto devo aggiungere? Penso che quello che ho scritto lì, riguarda tutto il "enum # feed". –

+0

@Priti, mi piace molto l'esempio 'map!' - grazie. Spero ancora di ottenere più risposte con più esempi. Attualmente, 'feed' sembra essere abbastanza inutile in" il mondo reale ". – tessi

0

Come un addendum, dal 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