Замораживание константных таблиц
Часть раздела Введение в 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) возвращает, заморожена ли таблица, а заморозка является поверхностной: вложенные таблицы остаются изменяемыми, если не заморозить и их. Разморозить таблицу также нельзя: после заморозки она навсегда остаётся замороженной.
Замороженная таблица констант вместе с литеральным объединением для параметров — это полноценный перечислимый тип Luau: именованные значения во время выполнения, которые никто не может изменить, и проверка во время редактирования везде, где они используются.
Задание
ЛегкоСоздайте frozen константную таблицу с именем 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)и выведите возвращаемое им логическое значение
Попробуйте сами
-- Напишите код здесь
-- 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 возвращённый boolean
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в 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-словариПотренируйтесь самостоятельно: Онлайн-компилятор Lua