Roblox GuidebookБаза знаний
Русский ⌄

Разработка / 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 и не запускает игровую систему.

Порядок проверки пороговОткрыть изображение крупнее ↗
Оригинальная учебная схема; не снимок 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: показанная строка не подтверждает происхождение числа.

ПроверкаОжидание
0new
4started
5halfway
10complete

Передайте правила вместе с проверками #

Сохраните порядок порогов, диапазон входных данных, ожидаемые ID и проверочные значения вокруг каждой границы. Укажите, требуется одно состояние или несколько независимых действий. Другой разработчик сможет воспроизвести решение и понять, почему перестановка веток меняет результат.

Для будущего расширения добавляйте новую границу сначала в таблицу, затем в код и тесты. Проверьте соседние значения и прежние состояния. Пример остаётся чистым вычислением Luau: здесь нет объектов Roblox, сетевого обмена, постоянного хранилища или реального прохождения. Полезный результат — проверяемая договорённость об одном выборе.

ПолеЗаписать
ВходИзвестное число этапов
ПорядокВысокий порог первым
РезультатОдин ID состояния
ПроверкиОбе стороны границ

Первоисточники

Roblox — Official documentation