Menu
Coddy logo textTech

Литеральные типы

Часть раздела Введение в 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) из других языков, как вы увидите в одной из следующих глав.

challenge icon

Задание

Легко

Создайте три псевдонима типов для объединения литералов (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]".

Выведите на экран, каждый элемент на отдельной строке:

  1. movePlayer(playerDirection)
  2. updateGameState(currentState)
  3. значение selectedDifficulty

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

-- Напишите код здесь
-- объявите типы Direction / GameState / Difficulty как литеральные объединения
-- объявите playerDirection, currentState, selectedDifficulty
-- movePlayer(direction: Direction): string -> "Moving [direction]"
-- updateGameState(state: GameState): string -> "Game state: [state]"
-- выведите три результата
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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