Структурированные и произвольные таблицы
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 40 из 73.
Теперь у вас есть два способа работы с таблицами записей: подход loose, который вы всегда использовали в Lua, и объявленные формы. Стоит сделать паузу и посмотреть, что даёт каждый из них.
Таблица loose принимает что угодно. У этой гибкости есть своя цена: опечатайтесь в названии поля (user.nmae) — и вы silently получите nil; забудьте поле — и ошибка всплывёт далеко от этого места, во время выполнения, в том коде, который первым обратится к пустому месту:
local user = {name = "Ana", age = 20}
print(user.nmae) -- loose table: silently prints nilОбъявите форму, и эти ошибки переместятся с этапа выполнения на этап редактирования. Проверка подсветит опечатку в тот момент, когда вы её напишете, ваш редактор сможет автодополнять имена полей, а объявление type также будет служить документацией того, что содержит table:
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 обрабатывает любую форму. Здесь также нет «слияния объявлений» (declaration merging): объявление двух типов с одинаковым именем в одной области видимости вызывает error, поэтому у каждой формы есть ровно одно определение.
Формы в Luau являются структурными: любая table с правильными полями нужных типов подходит, независимо от того, где и как она была создана. И таблицы 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 и двоеточиемИтоги: Определение структуры таблиц