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