2013-07-15 12 views
5

Ruby fornisce un meccanismo per consentire a un iteratore di yield tutti i valori di un altro iteratore? (o "subiterator", non sono sicuro di quale sia il nome corretto). Simile a yield fromResa tutti i valori da un altro iteratore

def f 
    yield 'a' 
    yield 'b' 
end 

def g 
    # yield everything from f 
    yield 'c' 
    yield 'd' 
end 
+0

'f {| x | cedere x} 'troppo lungo? :) –

+0

@JoachimIsaksson se 'f' restituisce più valori inizia a essere –

+0

anche se suppongo che {| * x | yield x} va bene ma idk se ci sono sottigliezze che mi mancano. Ma stavo cercando qualcosa che gestisse tutte le cose che possono accadere nelle normali interazioni con iteratori (eccezioni e quant'altro) senza nulla di speciale –

risposta

4

Questo è probabilmente l'approccio più idiomatica:

def f 
    yield 'a' 
    yield 'b' 
end 

def g(&block) 
    f(&block) 
    yield 'c' 
    yield 'd' 
end 
3

Un modo s 'Python3.3 + è questo:

def f 
    yield 'a' 
    yield 'b' 
end 

def g 
f &Proc.new # 'duplicate' the block given to g and pass it to f 
yield 'c' 
yield 'd' 
end 
+0

Non avevo idea che fosse possibile. Puoi dare qualche riferimento? perché "Proc.new' è il duplicato del blocco e non un proc vuoto? sembra piuttosto criptico a prima vista. – tokland

+2

I [documenti] (http://www.ruby-doc.org/core-2.0/Proc.html#method-c-new) specificano questo comportamento :). – nicooga

+1

Questo è triste perché ho cercato i documenti, ho letto quelle righe e non sono riuscito a collegare i punti :-(Temo che sia troppo implicito per i miei gusti. Non ricordo di aver trovato il codice che usa "funzionalità", quindi suppongo Non sono l'unico, risponde perfettamente alla domanda, quindi, +1 – tokland

Problemi correlati