0Pricing
Lua Academy · Lezione

Iteratori senza stato

Scriva iteratori senza stato come ipairs e ne implementi varianti personalizzate.

Iteratori senza stato è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 2 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 Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Che cos’è un iteratore senza stato?

Un iteratore senza stato non mantiene alcuno stato interno. Tutte le informazioni vengono passate come argomenti a ogni chiamata: lo stato invariabile e la variabile di controllo corrente.

ipairs: l’esempio canonico

ipairs non mantiene stato: utilizza la tabella come stato e l’indice corrente come variabile di controllo.

local function myIpairs(t, i)
  i = i + 1
  local v = t[i]
  if v ~= nil then return i, v end
end
-- Use: for i,v in myIpairs, t, 0 do

Iteratore squares

Un iteratore senza stato che restituisce quadrati successivi. Lo stato contiene il limite, mentre la variabile di controllo è il numero corrente.

local function squaresIter(max, n)
  n = n + 1
  if n <= max then return n, n*n end
end
for n, sq in squaresIter, 5, 0 do
  print(n, sq)
end

Nessuna closure necessaria

Gli iteratori senza stato evitano l’allocazione di closure. Poiché tutto lo stato viene passato come argomento, non viene effettuata alcuna allocazione nell’heap a ogni iterazione.

Implementare un iteratore in stile pairs

Un iteratore senza stato chiave-valore che utilizza next come funzione iteratore, esattamente come funziona pairs.

for k, v in next, {a=1, b=2} do
  print(k, v)
end

Funzione next

next(t, k) restituisce la coppia chiave-valore successiva alla chiave k. Passi nil (oppure ometta l’argomento) per iniziare dall’inizio.

local t = {x=10, y=20}
local k, v = next(t, nil)
print(k, v)
k, v = next(t, k)
print(k, v)

Iteratore personalizzato di intervalli

Un iteratore senza stato di intervalli con passo. Lo stato contiene una tabella di configurazione; il controllo è il valore corrente.

local function rangeIter(state, n)
  n = n + state.step
  if n <= state.limit then return n end
end
for v in rangeIter, {limit=10, step=2}, 0 do
  print(v)
end

Vantaggio in termini di prestazioni

Gli iteratori senza stato sono ideali per i loop intensivi. Non viene creata una closure a ogni chiamata, perciò sono più veloci degli iteratori con closure e stato nelle traversate semplici.

Limitazioni

Quando l’iterazione richiede uno stato complesso (più contatori, code o dati dinamici), gli iteratori senza stato diventano poco pratici. Utilizzi invece iteratori con closure e stato oppure coroutine.

Combinare con table.move

Un iteratore senza stato di una porzione restituisce gli elementi di una sezione di tabella. Lo stato invariabile contiene l’array e l’indice finale; il controllo è l’indice corrente.

Iteratori senza stato della libreria standard

ipairs, pairs (tramite next) e string.gmatch utilizzano internamente implementazioni senza stato o quasi senza stato.

Domanda sugli iteratori senza stato

Che cosa rende un iteratore privo di stato?

Riepilogo: iteratori senza stato

Gli iteratori senza stato ricevono tutto il contesto come argomenti, non richiedono l’allocazione di closure e offrono prestazioni elevate. Sono ideali per semplici traversate sequenziali, come l’indicizzazione di array.

Domande Frequenti

La lezione «Iteratori senza stato» è gratuita?

Sì — il testo completo di «Iteratori senza stato» è 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 Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Iteratori senza stato»?

Scriva iteratori senza stato come ipairs e ne implementi varianti personalizzate. Eserciti Lua 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 Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua 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 2 di 4.

Quanto tempo richiede la lezione «Iteratori senza stato»?

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 Lua Academy?

Sì. Ogni lezione Lua 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. Il protocollo for generico
  2. Iteratori senza stato
  3. Iteratori con stato tramite closure
  4. Generatori basati su coroutine
← Torna a Lua Academy