Циклы while и repeat-until
Используйте while и repeat-until для итераций, управляемых условиями.
«Циклы while и repeat-until» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Цикл while
Цикл while повторяет своё тело, пока условие истинно. Условие проверяется перед каждой итерацией. Если изначально условие ложно, тело не выполнится ни разу. Всегда следите за тем, чтобы цикл продвигался к условию выхода, иначе может возникнуть бесконечный цикл.
local count = 1
while count <= 5 do
print(count)
count = count + 1
end
-- prints 1 through 5Цикл repeat-until
Цикл repeat...until — это эквивалент цикла do-while в Lua. Тело выполняется как минимум один раз, а условие проверяется после каждой итерации. Цикл останавливается, когда условие становится истинным (в отличие от while). Переменные, объявленные внутри тела, видны в условии.
local n = 1
repeat
print(n)
n = n * 2
until n > 100
-- prints: 1, 2, 4, 8, 16, 32, 64Бесконечные циклы с break
Используйте while true do для циклов обработки событий или повторных попыток, добавляя break для выхода при выполнении условия. Такой шаблон часто используется в главных циклах игр и сетевых серверах, работающих непрерывно.
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Обратный отсчёт с while
Циклы while так же хорошо подходят для обратного счёта. Важно изменять переменную так, чтобы условие выхода в конце концов стало истинным. Если забыть обновлять счётчик, это часто приводит к бесконечному циклу.
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 1repeat-until для проверки ввода
Шаблон repeat-until идеально подходит для проверки ввода: сначала запросите значение, затем проверьте его. В этом шаблоне тело всегда выполняется как минимум один раз, что соответствует естественной последовательности «запросить, затем проверить».
-- 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Переменные цикла являются локальными
Переменные, объявленные с помощью local внутри тела цикла, создаются заново на каждой итерации. Это важно при захвате переменных цикла замыканиями: каждое замыкание захватывает собственную копию. Переменные, объявленные вне цикла, сохраняются между итерациями.
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Шаблон аккумулятора
Одна из распространённых задач для цикла while — накопление результата. Суммирование, умножение, конкатенация строк и построение таблицы следуют одному шаблону аккумулятора: инициализируйте переменную до цикла, обновляйте внутри цикла, используйте результат после него.
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Вложенные циклы
Циклы можно вкладывать друг в друга. Каждый цикл поддерживает собственный счётчик. Для ясности используйте описательные имена переменных. Инструкция break выходит только из самого внутреннего охватывающего цикла. Чтобы выйти сразу из нескольких уровней, может потребоваться переменная-флаг или 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
endgoto для выхода из нескольких уровней
В Lua 5.2 и новее появился goto для перехода к помеченной позиции. Хотя обычно его не рекомендуют, он уместен для аккуратного выхода из вложенных циклов без переменной-флага. Метки задаются с помощью ::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")Компромиссы при выборе while и repeat
while: используйте, когда итераций может не быть — условие проверяется сначала. repeat-until: используйте, когда нужна хотя бы одна итерация — проверка выполняется после. В большинстве циклов предпочтителен while. Используйте repeat-until для меню, запросов и циклов повторных попыток, где действие должно произойти до проверки.
-- 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Быстрая проверка
Когда проверяется условие в цикле repeat...until?
Итоги: while и repeat-until
Основные моменты:
while cond do ... end— проверка выполняется до тела; цикл может не выполниться ни разуrepeat ... until cond— проверка выполняется после тела; цикл выполняется как минимум один разbreakвыходит из самого внутреннего циклаgoto ::label::может вывести из вложенных циклов (Lua 5.2 и новее)- Локальные переменные цикла создаются заново на каждой итерации
- Используйте шаблон аккумулятора для построения результатов
Часто задаваемые вопросы
Урок «Циклы while и repeat-until» бесплатный?
Да — полный текст урока «Циклы while и repeat-until» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Циклы while и repeat-until»?
Используйте while и repeat-until для итераций, управляемых условиями. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Циклы while и repeat-until»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Инструкции if, elseif и else
- Циклы while и repeat-until
- Числовой цикл for
- Обобщённый for и break