Menu
CoddyTech

Структурированные и произвольные таблицы

Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 42 из 80.

Теперь у тебя есть два способа работать с таблицами-записями: нестрогий способ, которым ты всегда пользовался в Lua, и объявленные структуры. Стоит остановиться и посмотреть, что даёт каждый из них.

В нестрогую таблицу можно поместить что угодно. За эту гибкость приходится платить: если ошибиться в названии поля (user.nmae), ты незаметно получишь nil; если забыть поле, ошибка проявится далеко от места её возникновения, во время выполнения, в том коде, который первым обратится к отсутствующему полю:

local user = {name = "Ana", age = 20}
print(user.nmae) -- таблица без строгой проверки: незаметно выводит nil

Объяви структуру — и эти ошибки будут обнаруживаться не во время выполнения, а при редактировании. Проверяющая система укажет на опечатку сразу, как только ты её допустишь, редактор сможет подсказывать названия полей, а объявление type послужит документацией о содержимом таблицы:

type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ ошибка типа: ключ 'nmae' не найден в User

Если ты знаком с TypeScript, учти, что в Luau нет ключевого слова interface: type подходит для любой структуры. Здесь также нет «объединения объявлений»: объявление двух типов с одинаковым именем в одной области видимости считается ошибкой, поэтому у каждой структуры есть ровно одно определение.

Структуры в Luau структурные: любая таблица с нужными полями нужных типов подходит, независимо от того, где и как она была создана. Нестрогие таблицы тоже полезны: для быстрых скриптов и действительно динамических данных объявленная структура не нужна. Но для данных, передаваемых между функциями, структура позволяет обнаружить ошибки, пока исправлять их ещё дёшево.

challenge icon

Задание

Легко

Преобразуй таблицу без объявленной структуры в таблицу с объявленной структурой.

  1. Над таблицей напиши type Pet = {name: string, age: number}.
  2. Аннотируй таблицу: local pet: Pet = {name = "Biscuit", age = 3}.
  3. Под первым вызовом print добавь print(pet.age).

Нажми Запустить код: вывод содержит Biscuit и 3.

Попробуйте сами

-- Таблица без строгой структуры: её поля ничем не проверяются
local pet = {name = "Biscuit", age = 3}
print(pet.name)

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

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