Структурированные и произвольные таблицы
Часть раздела Введение в 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 структурные: любая таблица с нужными полями нужных типов подходит, независимо от того, где и как она была создана. Нестрогие таблицы тоже полезны: для быстрых скриптов и действительно динамических данных объявленная структура не нужна. Но для данных, передаваемых между функциями, структура позволяет обнаружить ошибки, пока исправлять их ещё дёшево.
Задание
ЛегкоПреобразуй таблицу без объявленной структуры в таблицу с объявленной структурой.
- Над таблицей напиши
type Pet = {name: string, age: number}. - Аннотируй таблицу:
local pet: Pet = {name = "Biscuit", age = 3}. - Под первым вызовом print добавь
print(pet.age).
Нажми Запустить код: вывод содержит Biscuit и 3.
Попробуйте сами
-- Таблица без строгой структуры: её поля ничем не проверяются
local pet = {name = "Biscuit", age = 3}
print(pet.name)
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции без возвращаемого значенияНеобязательные параметрыЗначения параметров по умолчаниюЗначения по умолчанию для булевых параметровФункции с переменным числом аргументовОпределение типов функцийПовторение: типизированные функции2Основные типы
Число, строка и булево значениеТип 'any': запасной выходТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовПовторение: практика с основными типами5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: массивы и отображения
Типизированные массивыДобавление и чтение элементовЧто такое тип отображения?Объявление и доступ к отображениямПеребор таблицТаблицы смешанной структурыЧтение сеткиСоздание сеткиtable.unpackПовторение: массивы и отображения6Типизация структуры таблиц
Встроенные аннотации структурПсевдонимы типов для структурНеобязательные свойстваСтруктурированные и произвольные таблицыРасширение структурДобавление методов в структурыМетоды с Self и двоеточиемИтоги: Определение структуры таблицПотренируйтесь самостоятельно: Онлайн-компилятор Luau