Структурированные и произвольные таблицы
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 40 из 73.
Теперь у вас есть два способа работать с таблицами записей: способ loose, который вы всегда использовали в Lua, и объявленные формы. Стоит остановиться и посмотреть, что даёт каждый из них.
Таблица loose принимает что угодно. У такой гибкости есть цена: опечатавшись в поле (user.nmae), вы молча получаете nil; забыв поле, вы обнаружите ошибку далеко от места её возникновения — во время выполнения, в том коде, который первым обратится к отсутствующему полю:
local user = {name = "Ana", age = 20}
print(user.nmae) -- loose table: silently prints nilОбъявите форму — и эти ошибки переместятся со времени выполнения на этап редактирования. Проверяющий сразу укажет на опечатку, как только вы её допустите, редактор сможет предлагать имена полей при автодополнении, а объявление type одновременно станет документацией о содержимом таблицы:
type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ type error: key 'nmae' not found in UserЕсли вы переходите с TypeScript, обратите внимание: в Luau нет ключевого слова interface: type описывает любую форму. Здесь также нет «слияния объявлений»: объявление двух типов с одним и тем же именем в одной области видимости является ошибкой, поэтому у каждой формы есть ровно одно определение.
Формы Luau являются структурными: любая таблица с нужными полями правильных типов подходит, независимо от того, где и как она была создана. И у таблиц loose всё ещё есть своё применение: быстрым скриптам и действительно динамическим данным не нужна объявленная форма. Однако для всего, что передаётся между функциями, форма позволяет обнаружить ошибки, пока их ещё дёшево исправить.
Попробуйте сами
В этом уроке нет задания по программированию.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словари6Типизация структуры таблиц
Встроенные аннотации структурПсевдонимы типов для структурНеобязательные свойстваСтруктурированные и произвольные таблицыРасширение структурДобавление методов в структурыМетоды с Self и двоеточиемИтоги: Определение структуры таблицПотренируйтесь самостоятельно: Онлайн-компилятор Lua