Литеральные типы
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 33 из 73.
Типы вроде string допускают любую строку, но иногда имеют смысл только несколько точных значений. Тип literal использует само значение в качестве типа:
local mode: "dark" = "dark" -- разрешена только строка "dark"
local locked: true = true -- разрешено только булево значение trueСами по себе типы с единственным значением — всего лишь любопытная особенность. В сочетании с unions они становятся одним из самых полезных инструментов Luau: строго контролируемым набором допустимых значений:
type Direction = "north" | "south" | "east" | "west"
type GameState = "menu" | "playing" | "paused" | "gameover"
local move: Direction = "north" -- ✓
local state: GameState = "playing" -- ✓
-- local bad: Direction = "diagonal" -- ✗ ошибка типа!Теперь опечатка вроде "nort" или недопустимое значение вроде "diagonal" обнаруживается прямо во время редактирования; с обычным string такая ошибка прошла бы незамеченной и привела бы к сбою во время выполнения — если тебе вообще повезёт её заметить.
Типы literal чувствительны к регистру и требуют точного совпадения: "North" не соответствует "north". Строковые literal — самый распространённый случай, но boolean и (в более новых версиях Luau) числовые literal работают так же. Этот шаблон — объединение строковых literal — также используется в Luau вместо перечислений других языков, как ты увидишь в следующей главе.
Задание
ЛегкоCreate three literal-union type aliases:
Direction="north" | "south" | "east" | "west"GameState="menu" | "playing" | "paused" | "gameover"Difficulty="easy" | "medium" | "hard"
Объяви, используя псевдонимы:
playerDirection: Direction="north"currentState: GameState="playing"selectedDifficulty: Difficulty="medium"
Создай function movePlayer(direction: Direction): string, возвращающую "Moving [direction]", и function updateGameState(state: GameState): string, возвращающую "Game state: [state]".
Выведи каждое значение с новой строки:
movePlayer(playerDirection)updateGameState(currentState)- значение
selectedDifficulty
Попробуйте сами
-- Напишите код здесь
-- тип Direction / GameState / Difficulty как литеральные объединения
-- объявите playerDirection, currentState, selectedDifficulty
-- movePlayer(direction: Direction): string -> "Moving [direction]"
-- updateGameState(state: GameState): string -> "Game state: [state]"
-- выведите три результата
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словариПотренируйтесь самостоятельно: Онлайн-компилятор Lua