Необязательные свойства
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 39 из 73.
Не каждое поле присутствует всегда. В Lua отсутствующее поле таблицы просто читается как nil, что удобно, но именно так возникают такие ошибки, как attempt to concatenate a nil value.
Luau позволяет явно указать это в форме: добавь ? после типа поля, чтобы пометить его как optional:
type User = {
name: string, -- обязательный
email: string?, -- опционально: string или nil
}
local alice: User = {name = "Alice", email = "alice@luau.dev"}
local bob: User = {name = "Bob"} -- ✓ нормально, email необязателенРанее ты уже встречал это с переменными: string? — это сокращённая запись для string | nil. Теперь та же идея применяется к отдельным полям формы.
Поскольку optional поле может быть равно nil, перед его использованием необходимо выполнить проверку. Классический шаблон Lua работает, а в строгом режиме проверяющий код сужает type внутри ветви:
if bob.email then
print(`email: {bob.email}`) -- здесь email — это string
else
print("no email on file")
endOptional означает «может отсутствовать». Это не означает «любой type». Если email существует, это всё равно должен быть string.
Задание
ЛегкоСоздайте псевдоним типа с именем User, содержащий:
nameтипаstring(required)emailтипаstring?(optional)
Создайте двух пользователей:
alice: имя"Alice", электронная почта"alice@luau.dev"bob: имя"Bob", без электронной почты
Создайте function printContact, которая принимает User. Если у пользователя есть электронная почта, она выводит [name] - [email]; в противном случае она выводит [name] - no email.
Затем:
- выполните вызов
printContact(alice) - выполните вызов
printContact(bob) - выведите результат сравнения
bob.email == nil
Попробуйте сами
-- Напишите код здесь
-- 1) определите тип User с опциональным полем email
-- 2) создайте alice (с email) и bob (без)
-- 3) напишите printContact с проверкой на nil
-- 4) вызовите её для обоих пользователей, затем выведите bob.email == nil
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в 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-словариПотренируйтесь самостоятельно: Онлайн-компилятор Lua