Menu
Coddy logo textTech

Необязательные свойства

Часть раздела Введение в 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")
end

Optional означает «может отсутствовать». Это не означает «любой type». Если email существует, это всё равно должен быть string.

challenge icon

Задание

Легко

Создайте псевдоним типа с именем User, содержащий:

  • name типа string (required)
  • email типа string? (optional)

Создайте двух пользователей:

  • alice: имя "Alice", электронная почта "alice@luau.dev"
  • bob: имя "Bob", без электронной почты

Создайте function printContact, которая принимает User. Если у пользователя есть электронная почта, она выводит [name] - [email]; в противном случае она выводит [name] - no email.

Затем:

  1. выполните вызов printContact(alice)
  2. выполните вызов printContact(bob)
  3. выведите результат сравнения bob.email == nil

Попробуйте сами

-- Напишите код здесь
-- 1) определите тип User с опциональным полем email
-- 2) создайте alice (с email) и bob (без)
-- 3) напишите printContact с проверкой на nil
-- 4) вызовите её для обоих пользователей, затем выведите bob.email == nil
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Введение в Luau

Потренируйтесь самостоятельно: Онлайн-компилятор Lua