Безопасность 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 ненулевым до конца области видимости, а во время выполнения утверждение вызывает сбой сразу — в месте, где нарушено предположение, — а не где-то далеко от него.
В результате проверка типов заставляет вас обработать каждое значение, которое «может отсутствовать», прямо во время редактирования, и ошибка во время выполнения просто не возникает.
Задание
ЛегкоУкажите имя, для которого может отсутствовать безопасное значение по умолчанию.
- Оставьте
--!strictв первой строке. - Напишите
local function getDisplayName(fullName: string?): string, которая возвращаетfullName, если оно не равноnil, а в противном случае —"Anonymous User". - Выведите
getDisplayName("John Smith")иgetDisplayName(nil).
Нажмите Run Code: в выводе появятся John Smith и Anonymous User.
Попробуйте сами
--!strict
-- 1) getDisplayName(fullName: string?): string, используя "Anonymous User" в качестве значения по умолчанию
-- 2) выведите результат для "John Smith" и nil
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции без возвращаемого значенияНеобязательные параметрыЗначения параметров по умолчаниюЗначения по умолчанию для булевых параметровФункции с переменным числом аргументовОпределение типов функцийПовторение: типизированные функции2Основные типы
Число, строка и булево значениеТип 'any': запасной выходТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовПовторение: практика с основными типами5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов8Перечисления в стиле Luau
Паттерн перечислений (Enum) в LuauЧисловые перечисления с помощью таблицСтроковые перечисления как объединенияИспользование перечислений на основе литеральных объединенийЗамораживание константных таблицИтоги: Перечисления в стиле Luau11Продвинутые темы
Утверждения типовЗащита типов с помощью typeofТип neverБезопасность null в строгом режимеСигнатуры индексовПовторение: типы значений конфигурацииПовторение: тонкая настройка типов3Типизированные таблицы: массивы и отображения
Типизированные массивыДобавление и чтение элементовЧто такое тип отображения?Объявление и доступ к отображениямПеребор таблицТаблицы смешанной структурыЧтение сеткиСоздание сеткиtable.unpackПовторение: массивы и отображенияПотренируйтесь самостоятельно: Онлайн-компилятор Luau