Menu
Coddy logo textTech

Замораживание константных таблиц

Часть раздела Введение в 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: именованные значения во время выполнения, которые никто не может изменить, и проверка во время редактирования везде, где они используются.

challenge icon

Задание

Легко

Создайте frozen константную таблицу с именем Color, создав и заморозив её одним шагом с помощью table.freeze, содержащую:

  • Red = 1
  • Green = 2
  • Blue = 3

Создайте обычную (не замороженную) таблицу с именем settings и полем volume = 5.

Выведите каждое значение в отдельной строке:

  1. Color.Red
  2. Color.Blue
  3. является ли Color замороженной (table.isfrozen)
  4. является ли settings замороженной
  5. результат попытки добавить поле в 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Введение в Luau

Потренируйтесь самостоятельно: Онлайн-компилятор Lua