Menu
Coddy logo textTech

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

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

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

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

Эта дисциплина работает в обе стороны: если задан 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 не равным nil до конца области видимости, а во время выполнения assert приводит к сбою сразу же, в месте ложного предположения, а не где-то далеко в коде.

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

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 — использует обе функции и возвращает 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