Menu
CoddyTech

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

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

Самый распространённый сбой 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 ненулевым до конца области видимости, а во время выполнения утверждение вызывает сбой сразу — в месте, где нарушено предположение, — а не где-то далеко от него.

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

challenge icon

Задание

Легко

Укажите имя, для которого может отсутствовать безопасное значение по умолчанию.

  1. Оставьте --!strict в первой строке.
  2. Напишите local function getDisplayName(fullName: string?): string, которая возвращает fullName, если оно не равно nil, а в противном случае — "Anonymous User".
  3. Выведите getDisplayName("John Smith") и getDisplayName(nil).

Нажмите Run Code: в выводе появятся John Smith и Anonymous User.

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

--!strict
-- 1) getDisplayName(fullName: string?): string, используя "Anonymous User" в качестве значения по умолчанию
-- 2) выведите результат для "John Smith" и nil

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

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