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

Разработка / ROBLOX

Строки прогресса в Luau: число отдельно от подписи

Соберите понятную подпись прогресса, явно обработайте преобразование строки и не сравнивайте отображаемые числа как текст.

Обновлено:

Начните с небольшого счётчика доставки #

Представьте учебный маршрут доставки: всего двадцать посылок, сейчас доставлено семь. Значение для расчётов — число 7, а надпись для чтения — отдельное представление этого числа. Сначала решите, какая переменная хранит выполненную работу, а какое выражение собирает подпись. Только после этого имеет смысл подключать настоящий элемент интерфейса и проверять его расположение.

В упражнении используются фиксированные значения, выбранные автором. Оно не читает сообщения игроков, не выдаёт награды и не сохраняет прогресс. Вывод в консоль позволяет проверить операции со строками без заявления, что интерфейс Roblox уже работает. Заранее запишите ожидаемую подпись полностью, вместе с пробелами и знаками: тогда у проверки будет понятный результат.

Создайте подпись, сохранив число #

Запустите первый пример в интерпретаторе Luau или отдельном учебном скрипте. completed и total остаются числами. tostring получает их текстовое представление, а две точки соединяют части. Пробелы входят в сами строки, поэтому расстояния вокруг косой черты заданы намеренно. Первая строка результата должна точно выглядеть как Parcels: 7 / 20.

Следующая строка использует string.format и заполнители %d для тех же целых значений. Получается такая же подпись. Форматирование не изменяет completed. Когда позже увеличите числовой счётчик, соберите новую подпись из обновлённого значения. Ранее сохранённая текстовая переменная сама не обновится и может продолжить показывать старое количество.

Число и подписьОткрыть изображение крупнее ↗
Оригинальная схема: число хранится отдельно, подпись создаётся из его текущего значения.
local completed = 7
local total = 20
local caption = "Parcels: " .. tostring(completed) .. " / " .. tostring(total)
print(caption)
print(string.format("Parcels: %d / %d", completed, total))

Задайте пробелы и слова явно #

Конкатенация не добавляет разделитель между соседними частями. Если соединить слово Parcels и число без двоеточия и пробела, надпись становится менее понятной. Держите пунктуацию в одном видимом шаблоне, вместо того чтобы распределять её по несвязанным выражениям. При проверке сравнивайте полную строку, включая пробелы, с заранее записанным ожидаемым результатом.

Целочисленные заполнители подходят этому упражнению, потому что посылки здесь считаются целыми числами. Для дробного значения нужно отдельно выбрать правило отображения, а не обещать сохранение всех десятичных знаков через %d. Процент, округление или другая единица измерения — самостоятельное изменение задания. Сначала определите ожидаемую подпись для нового правила, затем меняйте пример.

Преобразуйте известную строку с проверкой #

Во втором примере исходная строка "7" задана автором. tonumber пытается получить число; при неудаче результат равен nil. Явная ветка с проверкой nil сообщает о неверном прогрессе и возвращает запасную подпись. При успешном преобразовании собирается обычный текст. Ошибка поэтому остаётся заметной, вместо тихой подмены неправильного значения нулём.

Для отрицательного сценария пример получает "seven". Две строки результата: Invalid progress и Parcels: unavailable. Преобразование ещё не проверяет правила игры: если будущая система принимает такие значения, ей понадобятся ограничения диапазона и требование целого количества. Пользовательский ввод, сообщения чата и их отображение в этом упражнении не используются и отдельно не рассматриваются.

Проверка преобразованияОткрыть изображение крупнее ↗
Оригинальная схема преобразования: при nil используется явная ошибочная ветка.
local function progressCaption(raw)
    local completed = tonumber(raw)
    if completed == nil then
        print("Invalid progress")
        return "Parcels: unavailable"
    end
    return string.format("Parcels: %d / %d", completed, 20)
end
print(progressCaption("7"))
print(progressCaption("seven"))

Не сортируйте прогресс как текст #

Сравнивая "100" и "20" как строки, вы запрашиваете текстовый порядок, а не числовую величину. Первый символ может определить результат раньше остальных цифр. В данном учебном случае сравнение строк возвращает true, хотя число 100 больше числа 20. Такое расхождение удобно использовать для обнаружения ошибочного выбора типа данных до подключения настоящего счётчика.

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

Разделите преобразование и игровые ограничения #

Успешный tonumber отвечает на вопрос, можно ли интерпретировать текст как число. Он не решает, подходит ли число для количества доставленных посылок. Отрицательное значение, дробь или количество выше total могут быть числами и одновременно нарушать задуманные правила. Запишите эти решения заранее, чтобы следующий разработчик понимал, какие проверки ещё нужны.

Демонстрация намеренно проверяет известную числовую строку и явно неправильное слово. Дополнительные исполняемые утверждения подтверждают разницу между текстовым и числовым сравнением. Они не подтверждают все варианты ввода, все языки или поведение опубликованной игры. При передаче результатов укажите именно эту область проверки и отдельно перечислите недостающие проверки предметных правил.

Переводите подпись, сохраняя смысл данных #

Объяснение может описывать подпись по-русски, но исполняемые примеры сохраняют фиксированный английский вывод: читатели на всех языках могут повторить одинаковую проверку. В настоящем локализованном интерфейсе слова и пунктуацию поместите в подходящий переведённый шаблон. Числовой смысл прогресса должен оставаться независимым от языка этой надписи и её порядка слов.

При последующем подключении интерфейса отдельно проверьте длинный перевод и расположение справа налево. Эта статья не демонстрирует такое подключение и не доказывает, что текст помещается на телефоне. Полезная граница здесь проста: число участвует в расчётах, а локализованная строка создаётся для чтения. Размер, направление и обновление настоящего элемента требуют отдельного наблюдения.

ВходОжидаемый вывод
Числа 7 и 20Parcels: 7 / 20
Строка 7Parcels: 7 / 20
Слово sevenОшибка и запасная подпись
Строки 100 и 20Текстовый результат true

Передайте воспроизводимый результат #

Сохраните оба исходных примера, ожидаемый вывод и файл утверждений рядом. Запишите, какой интерпретатор их выполнил и завершился ли запуск успешно. Коллега должен воспроизвести подпись и ошибочную ветку без аккаунта, сервера и доступа к вашей опубликованной игре. Название файла само по себе не заменяет проверку его содержимого и фактического вывода.

Перед расширением спросите: расчёты всё ещё используют числа, неудачное преобразование имеет явную ветку, а полная подпись содержит нужные разделители? Затем отдельно сформулируйте следующий шаг реального подключения. Правильный вывод в консоль подтверждает эти операции со строками. Он не подтверждает сохранение прогресса, показ игрокам, выдачу наград или обновление какого-либо существующего проекта.

ЗаписьЧто передать
ДанныеЧисловые completed и total
ПодписьШаблон и полная строка
ОшибкаВетка nil и запасной текст
ПроверкаИнтерпретатор и фактический вывод

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

Roblox — Official documentation