Замораживание константных таблиц
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 59 из 80.
У таблицы констант есть один недостаток: это всё ещё обычная таблица. Любой код где угодно может выполнить 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) возвращает признак того, заморожена ли таблица, а заморозка действует поверхностно: вложенные таблицы остаются изменяемыми, если их тоже не заморозить. Разморозить таблицу нельзя: замороженная таблица остаётся замороженной.
Замороженная таблица констант вместе с объединением литеральных типов для параметров — это полноценное перечисление Luau: именованные значения во время выполнения, которые никто не может подделать, и проверка во время редактирования везде, где они используются.
Задание
ЛегкоСоздай постоянную таблицу, которую ничто не сможет изменить.
- Создай
local Size = table.freeze({Small = 1, Medium = 2, Large = 3}). - Выведи
Size.Largeиtable.isfrozen(Size). - Сохрани
pcall(function() Size.Huge = 4 end)вlocal okи выведиok.
Нажми Run Code: вывод показывает 3, true и false.
Попробуйте сами
-- 1) local Size = table.freeze({...})
-- 2) выведите Size.Large и table.isfrozen(Size)
-- 3) сохраните в ok значение, которое возвращает pcall при запрещённой записи, и выведите его
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции без возвращаемого значенияНеобязательные параметрыЗначения параметров по умолчаниюЗначения по умолчанию для булевых параметровФункции с переменным числом аргументовОпределение типов функцийПовторение: типизированные функции2Основные типы
Число, строка и булево значениеТип 'any': запасной выходТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовПовторение: практика с основными типами5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов8Перечисления в стиле Luau
Паттерн перечислений (Enum) в LuauЧисловые перечисления с помощью таблицСтроковые перечисления как объединенияИспользование перечислений на основе литеральных объединенийЗамораживание константных таблицИтоги: Перечисления в стиле Luau3Типизированные таблицы: массивы и отображения
Типизированные массивыДобавление и чтение элементовЧто такое тип отображения?Объявление и доступ к отображениямПеребор таблицТаблицы смешанной структурыЧтение сеткиСоздание сеткиtable.unpackПовторение: массивы и отображенияПотренируйтесь самостоятельно: Онлайн-компилятор Luau