0Pricing
Ruby Academy · Lezione

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.next

Ottenere 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.class

Recuperare 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.next

StopIteration 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"
end

peek 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.next

Creare 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.next

Enumerator 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}"
end

Restituire 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.next

Mettere 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.new e 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.
  • StopIteration segnala 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.next

Domande 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.

Tutte le lezioni di questo corso

  1. Scrivere un metodo each personalizzato
  2. Includere Enumerable
  3. Enumerator lazy
  4. Oggetti Enumerator
← Torna a Ruby Academy