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) возвращает, заморожена ли таблица, а сама заморозка является поверхностной — вложенные таблицы остаются изменяемыми, если вы не заморозите и их тоже. Разморозить таблицу также нельзя: однажды замороженная таблица остаётся замороженной.

Замороженная таблица констант в сочетании с объединением литералов для параметров представляет собой полноценный enum в Luau: именованные значения во время выполнения, которые никто не может изменить, и проверка на этапе редактирования везде, где они используются.

challenge icon

Задание

Легко

Создайте замороженную константную таблицу с именем 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) и выведите возвращаемое значение типа 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 возвращённое булево значение
quiz iconПроверьте себя

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

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