Литеральные типы
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 33 из 73.
Типы вроде string разрешают любую строку — но иногда смысл имеют только несколько точных значений. Литеральный тип использует само значение в качестве типа:
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 они прошли бы дальше и вывалили ошибку только во время выполнения, если вам повезет это заметить.
Литеральные типы чувствительны к регистру и точны: "North" не совпадает с "north". Строковые литералы — самый частый случай, но литералы типа boolean и (в более новых версиях Luau) численные литералы работают точно так же. Этот паттерн — объединение строковых литералов — также является тем, чем Luau заменяет перечисления (enums) из других языков, как вы увидите в одной из следующих глав.
Задание
ЛегкоСоздайте три псевдонима типов для объединения литералов (literal-union):
Direction="north" | "south" | "east" | "west"GameState="menu" | "playing" | "paused" | "gameover"Difficulty="easy" | "medium" | "hard"
Объявите, используя созданные псевдонимы:
playerDirection: Direction="north"currentState: GameState="playing"selectedDifficulty: Difficulty="medium"
Создайте функцию movePlayer(direction: Direction): string, возвращающую "Moving [direction]", и функцию 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-словари