Инструкция break
Иногда проходить цикл целиком не нужно. Если вы что-то ищете и уже нашли, продолжать поиск незачем. Инструкция break сразу завершает цикл, и программа продолжает работу после end цикла.
Торговец Гуго приезжает через день, а дождь идёт каждый 3-й день. В какой день Гуго впервые приедет под дождём? Цикл выводит каждый проверяемый день, так что видно, где он останавливается:
for day = 1, 30 do
print("Проверяем день " .. day)
if day % 2 == 0 and day % 3 == 0 then
print("Гуго приезжает под дождём в день " .. day)
break
end
end
print("Готово")Проверяем день 1
Проверяем день 2
Проверяем день 3
Проверяем день 4
Проверяем день 5
Проверяем день 6
Гуго приезжает под дождём в день 6
ГотовоВ день 6 условие истинно. Программа выводит результат, а break завершает цикл: дни с 7 по 30 даже не проверяются, и программа переходит к print("Готово"). Без break цикл дошёл бы до дня 30 и сообщил бы ещё о днях 12, 18, 24 и 30.
Почти всегда break стоит внутри if: сам по себе он завершил бы цикл уже на первой итерации. Он работает одинаково в циклах while, for и repeat. Вам встретятся и программы на Lua с while true do: цикл, условие которого всегда истинно. Сам он никогда бы не закончился, поэтому где-то внутри у него есть if с break.
Чтобы после цикла знать, что вы нашли, сохраните это в переменной, созданной до цикла. Если цикл ничего не нашёл, переменная остаётся nil, и это можно проверить с помощью if. Дедушка Джо приходит каждый 4-й день, а Гуго — каждый 6-й. Встретятся ли они в первые 10 дней?
local meeting
for day = 1, 10 do
if day % 4 == 0 and day % 6 == 0 then
meeting = day
break
end
end
if meeting then
print("Они встречаются в день " .. meeting)
else
print("Они не встречаются")
endОни не встречаютсяС for day = 1, 20 do программа вывела бы Они встречаются в день 12.
В Lua нет continue. Во многих языках continue пропускает остаток текущей итерации и переходит к следующей. Lua его не знает: он принимает continue за имя переменной, а потом спотыкается о следующий за ним end. Программа даже не запускается:
for day = 1, 4 do
if day == 2 then
continue
end
print("День " .. day)
endmain.lua:4: syntax error near 'end'Вместо этого поместите остаток блока в if с противоположным условием:
for day = 1, 4 do
if day ~= 2 then
print("День " .. day)
end
endДень 1
День 3
День 4(В Lua есть ещё goto, который умеет прыгать в конец блока, но в этом курсе он вам не понадобится. В Luau из Roblox continue есть, в стандартном Lua — нет.)
Задание
- 1
У Эммы 40 монет, и каждый день она зарабатывает ещё 15, как показывает цикл. В цикле, под строкой, которая выводит монеты, добавьте
if, который выводитДень 8: Эмма покупает тележку!(с номером дня), когда у неё не меньше 150 монет. Запустите программу: сообщение появляется в каждый день, начиная с 8-го, а Эмме нужна всего одна тележка. Среди строк вы найдёте:День 8, монеты: 160 День 8: Эмма покупает тележку! - 2
Добавьте
breakв блокif, после вывода, чтобы цикл остановился в день, когда Эмма покупает тележку. Тогда последние две строки вывода цикла такие:День 8, монеты: 160 День 8: Эмма покупает тележку! - 3
Под циклом напишите ещё один цикл — для прилавка Эммы на ярмарке. Он открыт в дни с 1 по 10, но не в дождливые, то есть не каждый 3-й день. Выведите по одной строке на каждый день, когда прилавок открыт. В Lua нет
continue, поэтому используйтеif. Конец вывода такой:День 1: ярмарка День 2: ярмарка День 4: ярмарка День 5: ярмарка День 7: ярмарка День 8: ярмарка День 10: ярмарка