0Pricing
Lua Academy · Урок

Циклы 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 1

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

goto для выхода из нескольких уровней

В 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 — локальная установка не требуется.

Все уроки этого курса

  1. Инструкции if, elseif и else
  2. Циклы while и repeat-until
  3. Числовой цикл for
  4. Обобщённый for и break
← Назад к Lua Academy