Menu
Coddy logo textTech

Безопасность Nil в строгом режиме

Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 71 из 73.

Самая распространённая причина сбоя в Lua — «попытка обратиться к nil»: код предполагал, что значение существует, хотя это было не так. Ответ Luau — строгая работа с nil: при использовании --!strict обычная string никогда не может быть nil. Если nil действительно возможен, это должно быть указано в типе с помощью ?:

--!strict
local nickname: string? = nil   -- ok: string ИЛИ nil
local username: string = nil    -- ✗ ошибка типа в режиме strict

Эта строгость работает в обе стороны: если у тебя есть string?, строгий режим не позволит использовать его как строку, пока ты не исключишь nil. Стандартный инструмент — обычное сравнение, которое сужает тип так же, как проверка с помощью typeof:

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- здесь name — string
    end
    return "NOBODY"
end

Если nil был бы ошибкой, а не допустимым случаем, используй assert: после assert(x ~= nil) проверяющий код считает x ненулевым до конца области видимости, а во время выполнения проверка завершается с ошибкой сразу — в месте нарушения предположения, — вместо того чтобы сбой произошёл где-нибудь далеко.

Результат: проверяющий код заставляет тебя обработать каждое значение, которое «может отсутствовать», прямо во время редактирования, и ошибка выполнения просто никогда не возникает.

challenge icon

Задание

Легко

Обрабатывай поля профиля пользователя, которые могут отсутствовать. Начни файл с --!strict.

  • getDisplayName(fullName: string?): string: возвращает fullName, если это не nil, в противном случае — Anonymous User.
  • formatEmail(email: string?): string: возвращает email в нижнем регистре (string.lower), если это не nil, в противном случае — No email provided.
  • getUserInfo(name: string?, email: string?): string: использует both функции и возвращает Name: [processed name], Email: [processed email].

Затем выведи каждое значение в отдельной строке:

  1. getDisplayName("John Smith")
  2. getDisplayName(nil)
  3. formatEmail("ALICE@EXAMPLE.COM")
  4. formatEmail(nil)
  5. getUserInfo("Bob Johnson", "bob@test.com")
  6. getUserInfo(nil, nil)
  7. getUserInfo("Sarah Wilson", nil)

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

--!strict
-- Напишите код здесь
-- 1) getDisplayName(fullName: string?): string — nil-check, fallback "Anonymous User"
-- 2) formatEmail(email: string?): string — string.lower or "No email provided"
-- 3) getUserInfo(name: string?, email: string?): string — объедините оба
-- 4) выведите семь тестовых вызовов из задания
quiz iconПроверьте себя

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

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

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