Lua Academy · Lektion

Tilstandsløse iteratorer

Skriv tilstandsløse iteratorer som ipairs, og implementér brugerdefinerede varianter.

Lektion 2 af 413 trin

Tilstandsløse iteratorer er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad er en tilstandsløs iterator?

En tilstandsløs iterator har ingen intern tilstand. Alle oplysninger sendes som argumenter ved hvert kald: den invariante tilstand og den aktuelle kontrolvariabel.

ipairs: Det klassiske eksempel

ipairs er tilstandsløs — den bruger tabellen som tilstand og det aktuelle indeks som kontrolvariabel.

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

squares-iterator

En tilstandsløs iterator, der returnerer fortløbende kvadrater. Tilstanden indeholder grænsen, og kontrolvariablen er det aktuelle tal.

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

Ingen closure nødvendig

Tilstandsløse iteratorer undgår allokering af closures. Da al tilstand sendes som argumenter, sker der ingen allokering på heapen pr. gennemløb.

Implementering af en pairs-lignende iterator

En tilstandsløs nøgleværdi-iterator, der bruger next som iteratorfunktion — præcis sådan fungerer pairs.

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

next-funktionen

next(t, k) returnerer det næste nøgle-værdi-par efter nøglen k. Send nil (eller udelad argumentet) for at starte fra begyndelsen.

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

Brugerdefineret intervaliterator

En tilstandsløs intervaliterator med trin. Tilstanden indeholder en konfigurationstabel, og kontrollen er den aktuelle værdi.

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

Ydelsesfordel

Tilstandsløse iteratorer er ideelle i tætte løkker. Der oprettes ingen closure pr. kald, hvilket gør dem hurtigere end tilstandsfulde closure-iteratorer ved simple gennemløb.

Begrænsninger

Når gennemløbet kræver kompleks tilstand (flere tællere, køer eller dynamiske data), bliver tilstandsløse iteratorer besværlige. Brug i stedet tilstandsfulde closure-iteratorer eller coroutiner.

Kombination med table.move

En tilstandsløs udsnitsiterator returnerer elementer fra et tabeludsnit. Den invariante tilstand indeholder arrayet og slutindekset, mens kontrollen er det aktuelle indeks.

Tilstandsløse iteratorer i standardbiblioteket

ipairs, pairs (via next) og string.gmatch bruger internt tilstandsløse eller næsten tilstandsløse designs.

Spørgsmål om tilstandsløse iteratorer

Hvad gør en iterator tilstandsløs?

Opsummering: Tilstandsløse iteratorer

Tilstandsløse iteratorer modtager al kontekst som argumenter, kræver ingen allokering af closures og har høj ydeevne. De er ideelle til simple sekventielle gennemløb som indeksering af arrays.

Gratis at komme i gang

Lær Lua med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
40
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “Tilstandsløse iteratorer” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Tilstandsløse iteratorer”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Tilstandsløse iteratorer”?

Skriv tilstandsløse iteratorer som ipairs, og implementér brugerdefinerede varianter. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Lua Academy?

Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Tilstandsløse iteratorer”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Lua Academy-lektion?

Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Protokollen for generisk for
  2. Tilstandsløse iteratorer
  3. Tilstandsbaserede iteratorer med closures
  4. Coroutine-baserede generatorer
← Tilbage til Lua Academy