Lua Academy · Lektion

while- och repeat-until-loopar

Använd while och repeat-until för villkorsstyrd iteration.

Lektion 2 av 412 steg

while- och repeat-until-loopar är en gratis lektion i Lua Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lua Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lua Academy innehåller totalt 4 lektioner.

while-loopen

En while-loop upprepar sitt innehåll så länge villkoret är sant. Villkoret kontrolleras före varje iteration. Om villkoret är falskt från början körs innehållet aldrig. Se alltid till att loopen närmar sig avslutningsvillkoret, så att Ni undviker oändliga loopar.

local count = 1

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

repeat-until-loop

Loopen repeat...until motsvarar do-while i Lua. Kroppen körs minst en gång, och villkoret kontrolleras efter varje iteration. Loopen avslutas när villkoret blir sant (motsatsen till while). Variabler som deklareras i kroppen är synliga i villkoret.

local n = 1

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

Oändliga loopar med break

Använd while true do för händelseloopar eller försök igen-mönster, tillsammans med break för att avsluta när ett villkor är uppfyllt. Detta mönster är vanligt i huvudloopar för spel och nätverksservrar som kör 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

Nedräkning med while

While-loopar fungerar lika bra när ni räknar nedåt. Det viktiga är att uppdatera variabeln på ett sätt som så småningom uppfyller avslutningsvillkoret. Att glömma uppdatera räknaren är en vanlig orsak till oändliga loopar.

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 för validering av indata

Mönstret repeat-until passar utmärkt för validering av indata: fråga en gång och kontrollera sedan. I detta mönster körs kroppen alltid minst en gång, vilket motsvarar det naturliga flödet "fråga och validera sedan".

-- 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

Loopvariabler är lokala

Variabler som deklareras med local i en loopkropp skapas på nytt i varje iteration. Detta är viktigt när loopvariabler fångas i closures — varje closure fångar sin egen kopia. Variabler som deklareras utanför loopen finns kvar mellan iterationerna.

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

Ackumulatormönstret

Ett vanligt användningsområde för while-loopar är att ackumulera ett resultat. Summor, produkter, strängsammanslagning och tabelluppbyggnad följer alla ackumulatormönstret: initiera före loopen, uppdatera i loopen och använd resultatet efteråt.

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

Kapslade loopar

Loopar kan kapslas i varandra. Varje loop har sin egen räknare. Använd beskrivande variabelnamn för tydlighetens skull. Satsen break avslutar endast den innersta omslutande loopen — för att avsluta flera nivåer kan ni behöva en flaggvariabel 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 för att avsluta flera nivåer

Lua 5.2+ introducerade goto för hopp till en märkt position. Även om det vanligtvis avråds från att använda det, är det ett legitimt sätt att avsluta kapslade loopar på ett tydligt sätt utan en flaggvariabel. Etiketter definieras 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")

Avvägningar mellan while och repeat

while: använd när loopen kan behöva köras noll gånger — villkoret kontrolleras först. repeat-until: använd när loopen måste köras minst en gång — kontrollera efteråt. Föredra while för de flesta loopar. Använd repeat-until för menyer, frågor och försök igen-loopar där åtgärden måste utföras före 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

Snabbkontroll

När kontrolleras villkoret i en repeat...until-loop?

Sammanfattning: while och repeat-until

Viktiga punkter:

  • while cond do ... end — kontrollerar före; kanske körs inte alls
  • repeat ... until cond — kontrollerar efter; körs minst en gång
  • break avslutar den innersta loopen
  • goto ::label:: kan avsluta kapslade loopar (Lua 5.2+)
  • Lokala loopvariabler skapas på nytt i varje iteration
  • Använd ackumulatormönstret för att bygga resultat
Gratis att börja

Lär dig Lua med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
40
Lektioner
159

Vanliga frågor

Är lektionen ”while- och repeat-until-loopar” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lua Academy, inklusive ”while- och repeat-until-loopar”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lua Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”while- och repeat-until-loopar”?

Använd while och repeat-until för villkorsstyrd iteration. Ni övar på Lua Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Lua Academy?

Du behöver inga förkunskaper. Utbildningen i Lua Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”while- och repeat-until-loopar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Lua Academy-lektionen?

Ja. Varje Lua Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. if-, elseif- och else-satser
  2. while- och repeat-until-loopar
  3. Numerisk for-loop
  4. Generisk for-loop och break
← Tillbaka till Lua Academy