Lua Academy · Lektion

while- og repeat-until-løkker

Brug while og repeat-until til betingelsesstyret iteration.

Lektion 2 af 412 trin

while- og repeat-until-løkker 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.

while-løkken

En while-løkke gentager sin krop, så længe betingelsen er sand. Betingelsen kontrolleres før hver gentagelse. Hvis betingelsen oprindeligt er falsk, udføres kroppen aldrig. Sørg altid for, at løkken bevæger sig mod afslutningsbetingelsen, så du undgår uendelige løkker.

local count = 1

while count <= 5 do
  print(count)
  count = count + 1
end
-- prints 1 through 5

repeat-until-løkke

repeat...until-løkken svarer til en do-while-løkke i Lua. Løkkens krop udføres mindst én gang, og betingelsen kontrolleres efter hver gentagelse. Løkken stopper, når betingelsen bliver sand (det modsatte af while). Variabler, der er erklæret i kroppen, er synlige i betingelsen.

local n = 1

repeat
  print(n)
  n = n * 2
until n > 100
-- prints: 1, 2, 4, 8, 16, 32, 64

Uendelige løkker med break

Brug while true do til hændelsesløkker eller gentagelsesmønstre sammen med break for at afslutte, når en betingelse er opfyldt. Dette mønster er almindeligt i spillets hovedløkker og netværksservere, der kører kontinuerligt.

local attempts = 0
local MAX = 3

while true do
  attempts = attempts + 1
  print("Attempt " .. attempts)
  if attempts >= MAX then
    print("Max attempts reached")
    break
  end
end

Nedtælling med while

While-løkker fungerer lige så godt, når du tæller nedad. Det afgørende er at opdatere variablen på en måde, der på et tidspunkt opfylder afslutningsbetingelsen. Hvis du glemmer at opdatere tælleren, er det en almindelig årsag til uendelige løkker.

local i = 10

while i > 0 do
  io.write(i .. " ")
  i = i - 1
end
print()   -- newline
-- output: 10 9 8 7 6 5 4 3 2 1

repeat-until til validering af inddata

Mønstret repeat-until er ideelt til validering af inddata: spørg én gang, og kontrollér bagefter. I dette mønster kører kroppen altid mindst én gang, hvilket passer til det naturlige forløb: "spørg, og validér derefter".

-- Simulated input validation
local inputs = {-1, 0, 5}  -- pretend user input
local idx = 0
local value

repeat
  idx = idx + 1
  value = inputs[idx]
  print("Got: " .. value)
until value > 0

print("Valid value: " .. value)  -- 5

Løkkens variabler er lokale

Variabler, der erklæres med local inde i en løkkekrop, oprettes igen ved hver gentagelse. Det er vigtigt, når du indfanger løkkevariabler i lukninger — hver lukning indfanger sin egen kopi. Variabler, der erklæres uden for løkken, bevares mellem gentagelserne.

local callbacks = {}

for i = 1, 3 do
  local captured = i        -- local per iteration
  callbacks[i] = function() return captured end
end

print(callbacks[1]())  -- 1
print(callbacks[2]())  -- 2
print(callbacks[3]())  -- 3

Akkumulatormønsteret

Et almindeligt anvendelsesområde for en while-løkke er at akkumulere et resultat. Sum, produkt, sammenkædning af strenge og opbygning af tabeller følger alle akkumulatormønsteret: initialisér før løkken, opdatér inde i løkken, og brug resultatet bagefter.

local numbers = {3, 1, 4, 1, 5, 9, 2, 6}
local sum = 0
local i = 1

while i <= #numbers do
  sum = sum + numbers[i]
  i = i + 1
end

print("Sum:", sum)     -- 31
print("Avg:", sum / #numbers)  -- 3.875

Indlejrede løkker

Løkker kan indlejres. Hver løkke har sin egen tæller. Brug beskrivende variabelnavne for at gøre koden tydelig. Sætningen break afslutter kun den inderste omsluttende løkke — hvis du vil afslutte flere niveauer, kan du få brug for en flagvariabel eller goto (Lua 5.2+).

local found = false
local target = 6

local i = 1
while i <= 3 and not found do
  local j = 1
  while j <= 3 do
    if i * j == target then
      print(i .. " * " .. j .. " = " .. target)
      found = true
      break
    end
    j = j + 1
  end
  i = i + 1
end

goto til afslutning af flere niveauer

Lua 5.2+ introducerede goto til at springe til en mærket position. Selvom det generelt frarådes, er det legitimt at bruge til at afslutte indlejrede løkker på en overskuelig måde uden en flagvariabel. Mærkater defineres med ::name::.

for i = 1, 5 do
  for j = 1, 5 do
  -- goto only valid approach for nested break in Lua
    if i * j > 10 then
      goto done
    end
    io.write(i*j .. " ")
  end
end
::done::
print()
print("Stopped early")

Afvejning mellem while og repeat

while: brug den, når løkken muligvis skal udføres nul gange — betingelsen kontrolleres først. repeat-until: brug den, når løkken skal udføres mindst én gang — betingelsen kontrolleres bagefter. Foretræk while til de fleste løkker. Brug repeat-until til menuer, forespørgsler og gentagelsesløkker, hvor handlingen skal udføres før kontrollen.

-- while: may execute zero times
local ready = false
while ready do
  print("never prints")
end

-- repeat-until: always executes at least once
local done = false
repeat
  print("runs once even though done=false")
  done = true
until done

Hurtig kontrol

Hvornår kontrolleres betingelsen i en repeat...until-løkke?

Opsummering: while og repeat-until

Vigtige punkter:

  • while cond do ... end — kontrollerer før; kører muligvis slet ikke
  • repeat ... until cond — kontrollerer efter; kører mindst én gang
  • break afslutter den inderste løkke
  • goto ::label:: kan afslutte indlejrede løkker (Lua 5.2+)
  • Lokale løkkevariabler oprettes igen ved hver gentagelse
  • Brug akkumulatormønsteret til at opbygge resultater
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 “while- og repeat-until-løkker” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “while- og repeat-until-løkker”, 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 “while- og repeat-until-løkker”?

Brug while og repeat-until til betingelsesstyret iteration. 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 “while- og repeat-until-løkker”?

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. if-, elseif- og else-sætninger
  2. while- og repeat-until-løkker
  3. Numerisk for-løkke
  4. Generisk for og break
← Tilbage til Lua Academy