Циклы while и repeat

Заставляем программу повторять действия, пока условие выполняется.

Цикл — конструкция, которая повторяет блок кода много раз, избавляя нас от копирования одинаковых строк.

Циклы — основа любой игры: каждый кадр обновить позиции, каждую секунду уменьшить таймер. Lua даёт два цикла с условием: while и repeat.

Цикл while

while проверяет условие перед каждым повтором. Если условие ложно с самого начала — тело не выполнится ни разу:

local countdown = 3
while countdown > 0 do
  print("Старт через", countdown)
  countdown = countdown - 1
end
print("Поехали!")

Вывод:

Старт через	3
Старт через	2
Старт через	1
Поехали!

Важно: внутри цикла нужно менять переменную условия, иначе цикл станет бесконечным и программа зависнет.

Цикл repeat-until

repeat проверяет условие после тела, поэтому тело всегда выполняется хотя бы раз:

local tries = 0
repeat
  tries = tries + 1
  print("Попытка", tries)
until tries >= 3

Вывод:

Попытка	1
Попытка	2
Попытка	3

Обратите внимание: в repeat условие после until — это условие выхода, а не продолжения. Цикл крутится, пока оно ложно.

Сравнение двух циклов

ЦиклПроверка условияМинимум выполнений
whileдо тела0 раз
repeatпосле тела1 раз

Досрочный выход: break

Оператор break мгновенно прерывает цикл:

local i = 1
while true do          -- бесконечный цикл
  if i > 3 then break end
  print(i)
  i = i + 1
end

Вывод:

1
2
3

Как работает под капотом

В Lua нет оператора continue (как в других языках) для пропуска итерации. Если нужно пропустить часть тела — оборачивают остаток в if. В новых версиях есть приём с метками goto, но для новичка проще обойтись условием.

Частые ошибки

  • Забыть изменять переменную условия — получится бесконечный цикл.
  • Думать, что until — это «пока». На самом деле это «до тех пор пока не», то есть условие выхода.
  • Искать continue — его в Lua нет, используйте if внутри тела.

Итог

  • while проверяет условие до тела и может не выполниться ни разу.
  • repeat-until выполняет тело хотя бы раз; until задаёт условие выхода.
  • break досрочно прерывает любой цикл.
  • В Lua нет continue; пропуск итерации делают через if.
Проверьте себя
1. Чем repeat-until отличается от while?
Arepeat выполняется только один раз
Brepeat проверяет условие после тела, поэтому тело гарантированно выполнится хотя бы раз
Cwhile работает быстрее
DОни полностью одинаковы
2. Что делает оператор break внутри цикла?
AПропускает текущую итерацию
BПерезапускает цикл
CНемедленно прерывает цикл
DУдваивает скорость цикла