Tilstandsløse iteratorer
Skriv tilstandsløse iteratorer som ipairs, og implementér brugerdefinerede varianter.
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 dosquares-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)
endIngen 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)
endnext-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)
endYdelsesfordel
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.
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
- Protokollen for generisk for
- Tilstandsløse iteratorer
- Tilstandsbaserede iteratorer med closures
- Coroutine-baserede generatorer