Lua Academy · leksjon

Generisk for og break

Bruk generisk for med pairs/ipairs, og styr løkkeflyten med break.

Leksjon 4 av 412 trinn

Generisk for og break er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Protokollen for generisk for

Lua sin generiske for-løkke fungerer med en iteratorfunksjon. Syntaksen er for vars in iter_func, state, init do. For hver iterasjon kaller Lua iter_func(state, lastVar) og tilordner returverdiene til vars. Løkken stopper når den første returverdien er nil.

-- Manual use of next() iterator
local t = {a=1, b=2, c=3}
local key, val = next(t, nil)   -- first entry
while key ~= nil do
  print(key, val)
  key, val = next(t, key)       -- advance
end

pairs() for alle nøkler

pairs(t) returnerer en iterator som går gjennom alle nøkkel-verdi-par i en tabell, inkludert strengnøkler, heltallsnøkler og blandede nøkler. Iterasjonsrekkefølgen for nøkler som ikke er heltall, er ikke spesifisert (hash-rekkefølge). Både array-delen og hash-delen tas med.

local config = {
  host = "localhost",
  port = 8080,
  debug = true,
  [1] = "first",
}

for key, value in pairs(config) do
  print(key, value)
end
-- Prints all 4 entries in any order

ipairs() for arraynøkler

ipairs(t) itererer over heltallsnøkler fra og med 1 og stopper ved den første nil-verdien. Den er trygg, forutsigbar og bevarer rekkefølgen. Bruk ipairs for arraylignende tabeller når rekkefølgen er viktig og De vil stoppe ved det første hullet.

local fruits = {"apple", "banana", "cherry"}

for i, fruit in ipairs(fruits) do
  print(i, fruit)
end
-- 1  apple
-- 2  banana
-- 3  cherry

-- stops at first nil
local t = {10, 20, nil, 40}
for i, v in ipairs(t) do
  print(i, v)  -- only 1,10 and 2,20
end

pairs kontra ipairs

Vit når De skal bruke de ulike funksjonene: ipairs brukes for ordnede, sekvensielle tabeller, mens pairs brukes for ordbøker eller blandede tabeller. ipairs stopper ved det første hullet med nil, mens pairs besøker alle nøkler som ikke har verdien nil. For rene tabeller er ipairs det mest idiomatiske valget.

local mixed = {10, 20, key="val", 30}

-- ipairs only sees array part in order
print("ipairs:")
for i, v in ipairs(mixed) do
  print(i, v)  -- 1:10, 2:20, 3:30
end

-- pairs sees everything
print("pairs:")
for k, v in pairs(mixed) do
  print(k, v)  -- 1:10, 2:20, 3:30, key:val
end

Egendefinert iterator med closure

De kan skrive Deres egen iterator som en closure. Fabrikkfunksjonen returnerer en tilstandsbevarende closure som flytter posisjonen fremover ved hvert kall. Når det ikke er mer å returnere, returnerer den nil for å stoppe den generiske for-løkken.

local function range(from, to, step)
  step = step or 1
  local i = from - step
  return function()
    i = i + step
    if i <= to then return i end
  end
end

for n in range(1, 10, 2) do
  io.write(n .. " ")
end
print()  -- 1 3 5 7 9

string.gmatch som iterator

string.gmatch(s, pattern) returnerer en iterator over alle treff på mønsteret i strengen s. Den brukes ofte til å dele opp strenger, hente ut tokens eller finne alle forekomster av et mønster.

local sentence = "the quick brown fox"

for word in string.gmatch(sentence, "%a+") do
  print(word)
end
-- the
-- quick
-- brown
-- fox

break i generisk for

De kan avslutte en generisk for-løkke tidlig ved å bruke break. Dette er nyttig ved søk: iterer til et treff blir funnet, og avslutt deretter med break. Etter avslutningen fortsetter kjøringen ved setningen etter end.

local inventory = {
  {name="sword", damage=50},
  {name="shield", armor=30},
  {name="bow", damage=35},
}

local target = "shield"
for i, item in ipairs(inventory) do
  if item.name == target then
    print("Found at index", i)
    break
  end
end

Endre tabeller under iterasjon

Sett aldri inn eller fjern nøkler fra en tabell mens De itererer med pairs() – oppførselen er udefinert (noen endringer kan bli oppdaget, mens andre hoppes over). Hvis De må endre en tabell, kan De samle endringene i en midlertidig liste og utføre dem etter løkken.

local t = {a=1, b=2, c=3, d=4}
local toDelete = {}

-- Collect keys to delete
for k, v in pairs(t) do
  if v % 2 == 0 then
    toDelete[#toDelete+1] = k
  end
end

-- Delete after iteration
for _, k in ipairs(toDelete) do
  t[k] = nil
end
-- t = {a=1, c=3}

Mønster for oppramsing

Når De trenger både indeksen og verdien, kan De bruke ipairs, som gir Dem begge. Når De bare trenger verdiene og ikke bryr Dem om indeksen, kan De bruke _ som et konvensjonelt variabelnavn for en indeks som ikke skal brukes.

local colors = {"red", "green", "blue"}

-- With index
for i, color in ipairs(colors) do
  print(i .. ": " .. color)
end

-- Ignore index with _
for _, color in ipairs(colors) do
  print(color)  -- just the values
end

next() direkte

next(t, key) er den underliggende funksjonen for gjennomgang. Den returnerer neste nøkkel-verdi-par etter key, eller nil hvis det ikke er flere. next(t, nil) gir det første elementet. De kan bruke next(t) ~= nil for å kontrollere om en tabell ikke er tom – dette er raskere enn å telle.

local function isEmpty(t)
  return next(t) == nil
end

print(isEmpty({}))       -- true
print(isEmpty({1,2,3}))  -- false
print(isEmpty({a=1}))    -- false

Hurtigsjekk

Hvilken iterator stopper ved det første nil-hullet i en tabell?

Oppsummering: generisk for og break

Oppsummering:

  • pairs(t) – alle nøkler, vilkårlig rekkefølge
  • ipairs(t) – heltallsnøkler fra 1 til n, sortert, stopper ved nil
  • Egendefinerte iteratorer: returner en closure som returnerer nil for å stoppe
  • break avslutter løkken tidlig
  • Endre aldri en tabell midt i en pairs-iterasjon; samle endringene og utfør dem etterpå
  • next(t) == nil – rask kontroll av om tabellen er tom
Gratis å komme i gang

Lær deg Lua med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
40
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Generisk for og break» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Generisk for og break», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Generisk for og break»?

Bruk generisk for med pairs/ipairs, og styr løkkeflyten med break. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Lua Academy?

Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Generisk for og break»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?

Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. if-, elseif- og else-setninger
  2. while- og repeat-until-løkker
  3. Numerisk for-løkke
  4. Generisk for og break
← Tilbake til Lua Academy