Oggetti Enumerator
Iterazione esterna
Oggetti Enumerator è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Ruby Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Ruby Academy include 4 lezioni in totale.
Iterazione esterna
Un Enumerator è un oggetto che rappresenta un'iterazione. Supporta l'iterazione esterna: si recuperano i valori uno alla volta con next, invece di passare un blocco a each.
enum = [10, 20, 30].each
puts enum.next
puts enum.nextOttenere un Enumerator
Chiamando un metodo iteratore come each senza blocco si riceve un Enumerator invece di avviare l'iterazione.
enum = [1, 2, 3].each
puts enum.classRecuperare valori con next
next restituisce l'elemento successivo ogni volta che lo si chiama. L'Enumerator ricorda la propria posizione.
letters = ["a", "b", "c"].each
puts letters.next
puts letters.next
puts letters.nextStopIteration alla fine
Quando i valori sono esauriti, next solleva StopIteration. È possibile intercettarla per terminare correttamente.
enum = [1, 2].each
begin
loop { puts enum.next }
rescue StopIteration
puts "done"
endpeek e rewind
peek osserva il valore successivo senza avanzare; rewind riporta all'inizio.
enum = [5, 6, 7].each
puts enum.peek
puts enum.next
enum.rewind
puts enum.nextCreare enumeratori personalizzati
Se ne può creare uno con Enumerator.new. Il blocco riceve un yielder y; i valori si aggiungono con y << o y.yield.
evens = Enumerator.new do |y|
n = 0
loop do
y << n
n += 2
end
end
puts evens.next
puts evens.next
puts evens.nextEnumerator infiniti
Poiché sono basati sul recupero su richiesta, gli Enumerator personalizzati possono essere infiniti. Si prendono solo i valori necessari.
counter = Enumerator.new do |y|
i = 1
loop { y << i; i += 1 }
end
p counter.first(5)Gli Enumerator sono Enumerable
Un Enumerator include Enumerable, quindi funzionano anche tutti i metodi consueti (map, select, take), combinando l'iterazione interna e quella esterna.
fib = Enumerator.new do |y|
a, b = 0, 1
loop do
y << a
a, b = b, a + b
end
end
p fib.take(8)with_index
with_index associa un indice a qualsiasi Enumerator, consentendo facoltativamente di iniziare da un numero personalizzato.
["x", "y", "z"].each.with_index(1) do |item, i|
puts "#{i}: #{item}"
endRestituire un Enumerator da each
Nelle proprie classi, quando non viene fornito alcun blocco si restituisca to_enum(:each) (o enum_for), così i chiamanti possono eseguire l'iterazione esternamente.
class Trio
def each
return to_enum(:each) unless block_given?
yield 1; yield 2; yield 3
end
end
e = Trio.new.each
puts e.next
puts e.nextMettere tutto insieme
Gli enumeratori offrono un controllo dettagliato:
- È possibile recuperare i valori con
next, visualizzarli senza rimuoverli o riavvolgerli. - È possibile crearne di personalizzati con
Enumerator.newe un yielder. - Sono Enumerable, quindi è possibile usare anche map/select/take.
odds = Enumerator.new do |y|
n = 1
loop { y << n; n += 2 }
end
p odds.first(4)Verifica rapida
Verifichi la propria comprensione degli oggetti Enumerator.
Riepilogo
Ha imparato a usare gli oggetti Enumerator:
- Iterazione esterna tramite
next,peek,rewind. StopIterationsegnala la fine.- È possibile crearne di personalizzati con
Enumerator.new { |y| ... }. - Sono Enumerable e possono essere infiniti.
nums = Enumerator.new { |y| 1.upto(3) { |n| y << n } }
puts nums.next
puts nums.nextDomande Frequenti
La lezione «Oggetti Enumerator» è gratuita?
Sì — il testo completo di «Oggetti Enumerator» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Ruby Academy, passa a CoddyKit PRO. Il corso Ruby Academy include 4 lezioni in totale.
Cosa imparerò in «Oggetti Enumerator»?
Iterazione esterna Eserciti Ruby Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Ruby Academy?
Non è richiesta alcuna esperienza precedente. Ruby Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Oggetti Enumerator»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Ruby Academy?
Sì. Ogni lezione Ruby Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.