Замораживание константных таблиц
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 55 из 73.
У таблицы констант есть одна слабость: это всё ещё обычная таблица. Любой код в любом месте может выполнить запись UserRole.Admin = 99 — и ваши «константы» незаметно перестают быть константами.
Luau устраняет этот пробел с помощью table.freeze. Заморозка делает таблицу доступной только для чтения во время выполнения: любая попытка добавить, изменить или удалить поле вызывает ошибку. Общепринятый подход — замораживать таблицу сразу при создании: table.freeze возвращает ту же самую таблицу, готовую к присвоению:
local Color = table.freeze({
Red = 1,
Green = 2,
Blue = 3,
})
print(Color.Red) -- 1: чтение работает как обычно
Color.Gold = 4 -- ✗ ошибка: попытка изменить таблицу только для чтенияВ отличие от всего остального в этом курсе, это защита во время выполнения — реальная ошибка в момент выполнения записи, а не предупреждение на этапе редактирования. Это защищает даже от кода, который средство проверки типов никогда не видело.
Два полезных дополнения: table.isfrozen(t) возвращает, заморожена ли таблица, а сама заморозка является поверхностной — вложенные таблицы остаются изменяемыми, если вы не заморозите и их тоже. Разморозить таблицу также нельзя: однажды замороженная таблица остаётся замороженной.
Замороженная таблица констант в сочетании с объединением литералов для параметров представляет собой полноценный enum в Luau: именованные значения во время выполнения, которые никто не может изменить, и проверка на этапе редактирования везде, где они используются.
Задание
ЛегкоСоздайте замороженную константную таблицу с именем Color — создайте и заморозьте её за один шаг с помощью table.freeze —, содержащую:
Red=1Green=2Blue=3
Создайте обычную (незамороженную) таблицу с именем settings с полем volume = 5.
Выведите на экран, каждое с новой строки:
Color.RedColor.Blue- заморожена ли
Color(table.isfrozen) - заморожена ли
settings - результат попытки добавить поле в
Colorвнутриpcall— вызовитеpcall(function() Color.Gold = 4 end)и выведите возвращаемое значение типа boolean
Попробуйте сами
-- Напишите код здесь
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) print Color.Red, Color.Blue, оба результата isfrozen
-- 4) pcall запрещённую запись и print возвращённое булево значение
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов8Перечисления в стиле Luau
Паттерн перечислений (Enum) в LuauЧисловые перечисления с помощью таблицСтроковые перечисления как объединенияИспользование перечислений на основе литеральных объединенийЗамораживание константных таблицИтоги: Перечисления в стиле Luau3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словари