0Pricing
Lua Academy · Lekcja

Pętle while i repeat-until

Proszę używać while i repeat-until do iteracji sterowanej warunkiem.

Pętle while i repeat-until to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.

Pętla while

Pętla while powtarza swoje ciało, dopóki warunek ma wartość prawdziwą. Warunek jest sprawdzany przed każdą iteracją. Jeśli początkowo jest fałszywy, ciało pętli nie wykona się ani razu. Należy zawsze zadbać o to, aby pętla przybliżała się do warunku zakończenia — w przeciwnym razie może powstać nieskończona pętla.

local count = 1

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

Pętla repeat-until

Pętla repeat...until jest odpowiednikiem konstrukcji do-while w języku Lua. Jej treść wykonuje się co najmniej raz, a warunek jest sprawdzany po każdej iteracji. Pętla kończy działanie, gdy warunek stanie się prawdziwy (odwrotnie niż w przypadku while). Zmienne zadeklarowane wewnątrz treści pętli są widoczne w warunku.

local n = 1

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

Pętle nieskończone z break

Używaj while true do w pętlach obsługi zdarzeń lub wzorcach ponawiania, a instrukcji break do zakończenia pętli po spełnieniu warunku. Ten wzorzec jest często stosowany w głównych pętlach gier oraz serwerach sieciowych działających bez przerwy.

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

Odliczanie za pomocą while

Pętle while równie dobrze nadają się do odliczania w dół. Kluczowe jest aktualizowanie zmiennej w taki sposób, aby ostatecznie został spełniony warunek wyjścia. Brak aktualizacji licznika jest częstą przyczyną pętli nieskończonych.

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 do walidacji danych wejściowych

Wzorzec repeat-until idealnie nadaje się do walidacji danych wejściowych: najpierw wyświetla monit, a następnie sprawdza dane. W tym wzorcu treść pętli zawsze wykonuje się co najmniej raz, co odpowiada naturalnemu przebiegowi „zapytaj, a następnie sprawdź”.

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

Zmienne pętli są lokalne

Zmienne zadeklarowane za pomocą local wewnątrz treści pętli są tworzone ponownie w każdej iteracji. Ma to znaczenie podczas przechwytywania zmiennych pętli w domknięciach — każde domknięcie przechwytuje własną kopię. Zmienne zadeklarowane poza pętlą zachowują wartość między iteracjami.

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

Wzorzec akumulatora

Częstym zastosowaniem pętli while jest gromadzenie wyniku. Sumowanie, mnożenie, konkatenacja napisów oraz tworzenie tabeli opierają się na wzorcu akumulatora: zainicjalizuj zmienną przed pętlą, aktualizuj ją wewnątrz pętli i użyj wyniku po jej zakończeniu.

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

Pętle zagnieżdżone

Pętle można zagnieżdżać. Każda pętla ma własny licznik. Dla większej czytelności używaj opisowych nazw zmiennych. Instrukcja break kończy tylko najbardziej wewnętrzną otaczającą pętlę — aby wyjść z kilku poziomów, może być potrzebna zmienna flagowa lub 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 do wyjścia z wielu poziomów

W Lua 5.2+ wprowadzono goto, które umożliwia skok do oznaczonego miejsca. Choć ogólnie odradza się jego używanie, jest ono uzasadnione do przejrzystego wyjścia z zagnieżdżonych pętli bez zmiennej flagowej. Etykiety definiuje się za pomocą ::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")

Kompromisy między while a repeat

while: używaj, gdy pętla może wykonać zero iteracji — warunek jest sprawdzany na początku. repeat-until: używaj, gdy potrzebujesz co najmniej jednej iteracji — warunek jest sprawdzany na końcu. W większości pętli preferuj while. Używaj repeat-until w menu, monitach i pętlach ponawiania, gdy działanie musi nastąpić przed sprawdzeniem.

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

Szybkie sprawdzenie

Kiedy sprawdzany jest warunek w pętli repeat...until?

Podsumowanie: while i repeat-until

Najważniejsze informacje:

  • while cond do ... end — sprawdza warunek przed wykonaniem; może nie wykonać się ani razu
  • repeat ... until cond — sprawdza warunek po wykonaniu; wykonuje się co najmniej raz
  • break kończy najbardziej wewnętrzną pętlę
  • goto ::label:: może zakończyć zagnieżdżone pętle (Lua 5.2+)
  • Lokalne zmienne pętli są tworzone ponownie w każdej iteracji
  • Używaj wzorca akumulatora do tworzenia wyników

Często zadawane pytania

Czy lekcja „Pętle while i repeat-until” jest bezpłatna?

Tak — pełny tekst „Pętle while i repeat-until” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Pętle while i repeat-until”?

Proszę używać while i repeat-until do iteracji sterowanej warunkiem. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Lua Academy?

Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Pętle while i repeat-until”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?

Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Instrukcje if, elseif i else
  2. Pętle while i repeat-until
  3. Pętla numeryczna for
  4. for ogólne i break
← Powrót do Lua Academy