Разработка / ROBLOX
Локальные переменные Luau: какое название маршрута видит код
Разберите границы local на примере маршрута: видимость во вложенном блоке, перекрытие имени, изменение внешнего значения и проверка результата без изменений ваших игр.
Начните с вопроса о видимости #
Представьте вымышленный прогулочный маршрут с общим названием Harbor и временным названием Tower для одной дополнительной ветки. Задача — понять, какое название доступно конкретной строке программы. Область видимости описывает участок кода, в котором можно обращаться к объявленной переменной. Это не расстояние между объектами игрового мира и не время, проведённое игроком на маршруте.
Сначала прочитайте пример как обычный Luau. Выпишите объявления переменных и блоки, в которых они находятся, затем проследите команды print в порядке выполнения. Упражнения меняют только строки в памяти. Они не переименовывают плейс Roblox, не меняют контрольную точку игрока, не обновляют табличку в Workspace и не сохраняют данные маршрута. Для таких действий понадобятся отдельный код и отдельные проверки.
Проследите local во вложенном блоке #
Первый пример объявляет routeName до блока do. Команда print внутри блока читает эту внешнюю переменную: вложенный блок может обращаться к именам, объявленным в охватывающей области. Внутри блока появляется новая локальная branchName. Имена обозначают разные переменные, поэтому совместная печать не заменяет общее название маршрута. После завершения блока последняя команда по-прежнему читает Harbor.
До запуска предскажите результат: сначала Harbor и Tower в одной строке, затем Harbor. Между аргументами первой команды print будет табуляция. Обратите внимание: локальная branchName не доступна снаружи своего блока. Если дальнейшему коду нужен рассчитанный внутри результат, предусмотрите возврат значения или подходящую переменную снаружи. Просто убрать local — не значит ясно организовать передачу данных.
local routeName = "Harbor"
do
local branchName = "Tower"
print(routeName, branchName)
end
print(routeName)Внешний блок не получает внутреннюю local #
Видимость направлена из охватывающей области во вложенную, но не возвращается автоматически наружу. Нарисуйте рамку вокруг блока do: branchName принадлежит коду внутри этой рамки. Строка после рамки не обращается к тому же локальному объявлению. Если в другом месте объявить ещё одну branchName, получится другая переменная, а не способ восстановить первоначальную.
При неожиданном nil сначала проверьте место объявления, а не меняйте название во всех строках. В обычном автономном примере необъявленное имя может обратиться к отсутствующему глобальному значению и дать nil. Это не открывает доступ к уже недоступной внутренней local. Анализ кода Studio также может отмечать неизвестные имена. Такой результат указывает на проблему границ, а не доказывает удаление нужной строки из сохранённых данных.
Отличайте объявление от присваивания #
Во втором примере внутри вложенного блока написано local routeName. Это новое объявление перекрывает внешнюю routeName: одинаковое написание внутри блока выбирает другую переменную со значением Tower. После блока снова видна внешняя переменная, которая сохранила Harbor. Перекрытие бывает намеренным, но начинающий разработчик может случайно применить его вместо изменения внешнего значения.
Следующий блок содержит routeName = "Market" без нового local. В этой строке видна внешняя локальная routeName, поэтому присваивание меняет именно её. Последний результат — Market. Сопоставьте три строки вывода: Tower, Harbor, Market. Различие создаёт объявление, а не кавычки или сам блок do. Когда значения обозначают разные понятия, предпочтительнее дать им разные понятные имена.
local routeName = "Harbor"
do
local routeName = "Tower"
print(routeName)
end
print(routeName)
do
routeName = "Market"
end
print(routeName)Учитывайте место объявления #
Локальная переменная доступна после своего объявления в соответствующей области. Не считайте, что local, написанный ниже, объясняет любое более раннее употребление того же имени. Двигайтесь сверху вниз и для каждого обращения находите доступное в этой точке объявление. Такой разбор особенно полезен в функции с несколькими небольшими блоками, где знакомое имя встречается неоднократно.
Для упражнения разместите внешнее название рядом со вложенным блоком и подпишите, какую переменную читает каждый print. При первом запуске оставьте готовые примеры неизменными, затем внесите одно контролируемое изменение. Если одновременно переносить объявления, переименовывать переменные и менять строки, причину нового вывода трудно установить. Записывайте предсказание отдельно от действительно полученного результата.
Функция создаёт дополнительную границу #
Параметры функции и её собственные локальные переменные относятся к области этой функции. Вызывающий код не получает эти имена только потому, что выполнил вызов. Если ему нужно рассчитанное название, верните его из функции и присвойте результат явно названной local в месте вызова. Вложенная функция может читать доступные внешние local, поэтому перенос функции в другое место способен изменить доступные ей значения.
Разделяйте видимость и передачу результата. Функция, которая печатает название, создала вывод, но не обязательно вернула значение вызывающему коду. Даже возврат строки сам по себе не обновляет интерфейс Roblox. Рассматривайте каждую границу отдельно: какие входные данные доступны, какой результат возвращается и какой вызывающий участок применит полученное значение к нужному объекту.
Глобальная переменная не объединяет все скрипты #
Присваивание имени без доступной local может создать или изменить глобальную переменную в текущем окружении исполнения. Это расширяет доступ внутри этого окружения и затрудняет поиск случайных совпадений имён. Но оно не создаёт надёжную общую переменную между отдельными скриптами Roblox, клиентами и сервером. Область видимости сама по себе не обеспечивает сетевой обмен и сохранение прогресса.
Начинайте с явных локальных переменных. Для общей договорённости нескольких скриптов изучайте продуманный интерфейс модуля; для общения клиента и сервера — соответствующий механизм связи и проверку данных. Это отдельные задачи за пределами упражнения. Замена недоступной local на глобальное имя не доказывает, что вы исправили синхронизацию многопользовательской игры или сохранение состояния игрока.
| Проверка | Ожидаемый результат |
|---|---|
| Читать внешнюю изнутри | Доступно Harbor |
| Читать внутреннюю снаружи | Внутренняя local недоступна |
| Перекрыть routeName | Снаружи остаётся Harbor |
| Присвоить внешней routeName | Снаружи становится Market |
Передайте проверяемый пример #
Для полезной передачи другому разработчику приложите неизменный пример, ожидаемый вывод и результат настоящего запуска. Отметьте внутреннее объявление как новую переменную, а последующее присваивание — как изменение видимой внешней переменной. Добавьте отрицательную проверку: внутреннее имя недоступно за пределами блока. Наши автономные проверки подтверждают эти границы и не затрагивают существующие игры Roblox.
Перед применением к настоящему скрипту найдите конкретную переменную и все использующие её блоки. Объясните, должно ли изменение остаться временным, обновить внешнее значение или выйти из функции через return. Проведите подходящую проверку в отдельной рабочей копии и запишите наблюдение. Успешный пример со строками подтверждает локальное поведение примера, но не доказывает правильность всей игровой системы маршрутов.
| Поле записи | Что приложить |
|---|---|
| Переменная | routeName |
| Блок | Точное объявление и обращение |
| Предсказание | Ожидаемое значение print |
| Наблюдение | Настоящий вывод запуска |