Разработка / ROBLOX
Условия Luau: порядок if и elseif на порогах прогресса
Постройте одно понятное состояние по числу пройденных этапов. Разберём порядок веток, точные границы, отличие нескольких if и проверку результата на учебных данных.
Сначала задайте состояния #
В вымышленном испытании десять этапов. Для учебной подписи нужны четыре состояния: new при нуле, started от одного, halfway от пяти и complete от десяти. Идентификаторы придуманы для примера. Это классификация числа, а не подтверждение прохождения, выдача значка или сохранение прогресса.
Запишите пороги до кода. На значении 5 одновременно верны условия «не меньше одного» и «не меньше пяти». Поэтому важно решить, какое состояние предпочтительнее. Если окно должно показывать одну подпись, нужно одно выбранное состояние, а не несколько несогласованных сообщений. Такой план сразу показывает, какие проверки должны идти раньше.
Проверьте более высокий порог первым #
Первый пример classifyProgress проверяет 10, затем 5, затем 1. В цепочке if, elseif, else выполняется первая подходящая ветка. Для 7 подходит порог 5: функция возвращает halfway и не продолжает проверять меньший порог. Для нуля ни один порог не подходит, поэтому работает else.
Запустите пример отдельно и сравните четыре строки: new, started, halfway, complete для входов 0, 1, 5, 10. Эти исходные данные намеренно небольшие. Вычисления реально выполнены самостоятельным интерпретатором Luau. Это проверка языка; она не показывает состояние какого-либо игрока Roblox и не запускает игровую систему.
local function classifyProgress(count)
if count >= 10 then
return "complete"
elseif count >= 5 then
return "halfway"
elseif count >= 1 then
return "started"
else
return "new"
end
end
for _, count in {0, 1, 5, 10} do
print(classifyProgress(count))
endНайдите ошибку обратного порядка #
Если первой поставить проверку count >= 1, значение 10 попадёт в started. Другие ветки не выполнятся, хотя условие завершения тоже верно. Ошибка не в числе и не в сравнении >=, а в приоритете веток. Самая широкая ранняя проверка забирает значения у более конкретных поздних.
Для диагностики выпишите вход, все истинные условия и первую выбранную ветку. Не исправляйте результат заменой строки started на complete: тогда одно пройденное испытание тоже станет завершением. Исправлять нужно порядок или договорённость состояний. Отдельные диапазоны полезны, когда условия нельзя выстроить по возрастающей специфичности.
Отличайте независимые if от elseif #
Второй пример для count=7 сначала использует два независимых if. Оба условия подходят, поэтому появляются two сообщения: started и halfway. Затем цепочка elseif на тех же данных печатает только halfway. Несколько if проверяются отдельно; цепочка выбирает одну ветку.
Независимые проверки полезны, когда нужны несколько совместимых действий. Для одной учебной подписи обычно требуется исключительный выбор. Запишите желаемое число сообщений до запуска и сравните с фактическим. Не называйте несколько if ошибкой всегда: ошибка возникает, если они не соответствуют требуемому поведению конкретной задачи.
local count = 7
if count >= 1 then
print("started")
end
if count >= 5 then
print("halfway")
end
if count >= 5 then
print("halfway")
elseif count >= 1 then
print("started")
endНе путайте истинность и сравнение #
В Luau число 0 и пустая строка являются истинными значениями условия; ложными считаются false и nil. Поэтому if count then не отвечает на вопрос, достигнут ли первый этап. В нашем упражнении нужен явный числовой порог count >= 1, а не проверка существования значения.
До классификации реальных данных отдельно проверьте допустимость: действительно ли передано конечное целое число в оговорённом диапазоне? Примеры здесь используют заранее известные учебные числа. Они не являются полной проверкой присланного клиентом прогресса. nil или строку нельзя молча считать новым участником и затем использовать для награды.
Проверьте обе стороны каждого порога #
Составьте матрицу 0, 1, 4, 5, 9, 10. Ожидания: new, started, started, halfway, halfway, complete. Для первой границы сравниваем ноль и единицу; для следующих — число перед порогом и сам порог. Так проверка замечает случайную замену >= на >.
Файл проверок также сравнивает правильный и ошибочный порядок на десяти и проверяет количество сообщений независимых веток. Он подтверждает поведение исходного упражнения. Новые диапазоны или дополнительные состояния требуют обновления матрицы; старый зелёный результат не доказывает правила, которые ещё не были добавлены.
Разделите состояние и отображение #
classifyProgress возвращает технический ID. Русское или другое экранное название можно выбирать отдельно по этому ID. Перевод не должен менять пороги. Хранить правила только в тексте кнопки неудобно: после локализации код и видимая подпись могут начать означать разные состояния.
В учебной передаче укажите четыре ID и смысл каждого. Смена подписи не выполняет игровых действий. Если позже состояние влияет на доступ к функции, серверные условия и переходы проверяются отдельно. Не выдавайте награду только потому, что интерфейс показал complete: показанная строка не подтверждает происхождение числа.
| Проверка | Ожидание |
|---|---|
| 0 | new |
| 4 | started |
| 5 | halfway |
| 10 | complete |
Передайте правила вместе с проверками #
Сохраните порядок порогов, диапазон входных данных, ожидаемые ID и проверочные значения вокруг каждой границы. Укажите, требуется одно состояние или несколько независимых действий. Другой разработчик сможет воспроизвести решение и понять, почему перестановка веток меняет результат.
Для будущего расширения добавляйте новую границу сначала в таблицу, затем в код и тесты. Проверьте соседние значения и прежние состояния. Пример остаётся чистым вычислением Luau: здесь нет объектов Roblox, сетевого обмена, постоянного хранилища или реального прохождения. Полезный результат — проверяемая договорённость об одном выборе.
| Поле | Записать |
|---|---|
| Вход | Известное число этапов |
| Порядок | Высокий порог первым |
| Результат | Один ID состояния |
| Проверки | Обе стороны границ |