0Pricing
Ruby Academy · Lezione

Enumerator lazy

Valutazione lazy

Enumerator lazy è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 3 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.

Valutazione lazy

Normalmente i metodi di Enumerable elaborano l'intera collezione in una volta. Un enumeratore lazy elabora gli elementi uno alla volta, solo quando necessario. Questo consente di lavorare con sequenze enormi o persino infinite.

result = (1..Float::INFINITY).lazy.map { |n| n * 2 }.first(5)
p result

Il problema dei metodi eager

Chiamare map su un intervallo infinito senza lazy non terminerebbe mai, perché prima tenta di creare un array risultato completo.

# Eager version would hang. Lazy completes instantly:
first_three = (1..Float::INFINITY).lazy.select(&:even?).first(3)
p first_three

Creare un enumeratore lazy

Si chiami .lazy su qualsiasi oggetto enumerable per ottenerne una versione lazy. I metodi concatenati diventano a loro volta lazy.

lazy = (1..10).lazy
puts lazy.class

Nulla viene eseguito finché non si forza

Le catene lazy costruiscono una ricetta, ma non la eseguono. Un metodo terminale come first, to_a o force avvia l'elaborazione.

chain = (1..Float::INFINITY).lazy.map { |n| n * n }
puts "Nothing computed yet"
p chain.first(4)

Forzare i risultati

force (alias to_a) materializza in un array una catena lazy limitata.

result = (1..20).lazy.select(&:odd?).first(5)
p result
all = (1..6).lazy.map { |n| n * 10 }.force
p all

Concatenare operazioni lazy

Più operazioni lazy vengono intercalate per elemento, invece di essere eseguite come passaggi completi separati. Ogni valore attraversa l'intera catena prima che inizi l'elaborazione del successivo.

result = (1..Float::INFINITY)
  .lazy
  .map { |n| n * n }
  .select { |n| n.even? }
  .first(4)
p result

take e take_while

take e take_while in modalità lazy smettono di recuperare valori quando la rispettiva condizione è soddisfatta.

result = (1..Float::INFINITY).lazy.take_while { |n| n < 6 }.to_a
p result

Sequenze infinite

Gli enumeratori lazy danno il meglio con i generatori. Si possono combinare con Enumerator per modellare flussi senza fine.

naturals = Enumerator.new do |y|
  n = 1
  loop { y << n; n += 1 }
end
p naturals.lazy.map { |x| x * 3 }.first(5)

Efficienza della memoria

Poiché le catene lazy non materializzano mai l'intera collezione intermedia, risparmiano memoria quando si filtrano grandi quantità di dati fino a ottenere pochi risultati.

big = (1..1_000_000).lazy
first_match = big.select { |n| n % 7 == 0 && n % 11 == 0 }.first
puts first_match

Quando usare lazy

Usi lazy quando:

  • La sorgente è infinita o molto grande.
  • Sono necessari solo pochi risultati.
  • Si desidera evitare grandi array intermedi.

Per le collezioni piccole, i metodi eager sono più semplici e sufficientemente veloci.

fizz = (1..Float::INFINITY).lazy.select { |n| n % 3 == 0 }.first(5)
p fizz

Mettere tutto insieme

Gli enumeratori lazy rimandano l'elaborazione:

  • .lazy rende lazy una catena.
  • L'elaborazione viene eseguita solo quando un metodo terminale recupera i valori.
  • Sono perfetti per sequenze infinite o enormi.
squares = (1..Float::INFINITY).lazy.map { |n| n * n }
p squares.select(&:odd?).first(4)

Verifica rapida

Verifichi la propria comprensione degli enumeratori lazy.

Riepilogo

Ha imparato a usare gli enumeratori lazy:

  • .lazy rimanda il calcolo.
  • I metodi terminali (first, to_a, force) avviano l'elaborazione.
  • Ogni valore attraversa l'intera catena su richiesta.
  • Sono ideali per sequenze infinite o grandi.
p (1..Float::INFINITY).lazy.select(&:even?).map { |n| n + 1 }.first(3)

Domande Frequenti

La lezione «Enumerator lazy» è gratuita?

Sì — il testo completo di «Enumerator lazy» è 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 «Enumerator lazy»?

Valutazione lazy 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 3 di 4.

Quanto tempo richiede la lezione «Enumerator lazy»?

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