Menu
CoddyTech

Использование перечислений на основе литеральных объединений

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

Объединения литеральных типов особенно полезны в качестве параметров функции. Укажи для параметра объединение типов, и проверяющая система гарантирует, что функцию будут вызывать только с допустимым значением из объединения:

type Direction = "up" | "down" | "left" | "right"

local function move(direction: Direction)
    print(`Moving {direction}...`)
end

move("left")  -- ✓
move("north") -- ✗ ошибка типа: не Direction

Внутри функции обработай все варианты без пропусков с помощью цепочки if/elseif. Поскольку тип ограничивает входные данные четырьмя значениями, достаточно проверить три из них, а последнее обработать в else:

local function describe(direction: Direction): string
    if direction == "up" then
        return "Going upward"
    elseif direction == "down" then
        return "Going downward"
    elseif direction == "left" then
        return "Turning left"
    else
        return "Turning right"
    end
end

Есть один нюанс: строки, поступающие извне, например из io.read(), имеют обычный тип string, потому что проверяющая система не знает, что введёт пользователь. Оператор приведения типа Luau :: решает эту проблему: value :: Type указывает проверяющей системе считать значение значением этого типа. Урок «Утверждения типов» ближе к концу этого раздела подробно разбирает приведение типов; пока достаточно одной строки:

local direction = io.read() :: Direction

Приведение типа — это обещание, а не проверка: во время выполнения ввод никак не проверяется. В рабочем коде сначала проверили бы его корректность; здесь же приведение позволяет типизированным функциям удобно принимать пользовательский ввод.

challenge icon

Задание

Легко

Преобразуй направление, введённое игроком, в действие.

  1. Напиши type Direction = "up" | "down" | "left" | "right".
  2. Напиши local function getAction(direction: Direction): string, возвращающую "Climb", "Drop", "Turn left" или "Turn right".
  3. Считай local direction = io.read() :: Direction и выведи getAction(direction).

Нажми Run Code: при вводе up на экране появится Climb.

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

-- 1) тип Direction
-- 2) getAction(direction: Direction): string
-- 3) local direction = io.read() :: Direction, затем выведите действие

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

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