Строковые перечисления как объединения
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 53 из 73.
Числа делают логи непонятными: видя 2, мало что понятно, но "down" объясняет всё. Для читаемых enum отличным инструментом в Luau являются literal union types — type, чьи элементы являются точными strings:
type Direction = "up" | "down" | "left" | "right"
local facing: Direction = "up" -- ✓
local typo: Direction = "upp" -- ✗ ошибка типа при редактированииПеременная, annotated типом Direction, может содержать эти four strings и ничего больше. Допустите опечатку — и анализатор сразу её обнаружит, так что ошибка никогда не дойдёт до player.
Во время runtime эти значения представляют собой plain strings. Выводите их через print, объединяйте их, сравнивайте с помощью == — к ним применимо всё, что вы знаете о strings:
print(facing) -- вверх
print(`facing {facing}`) -- facing вверхСравните два подхода, которые у вас теперь есть: таблица констант создаёт one значение в runtime (UserRole), хранящее элементы, тогда как literal union не создаёт никаких значений вовсе — не существует таблицы Direction, есть только правило анализатора, определяющее, какие strings подходят. Наглядные, самодокументируемые значения с нулевыми затратами в runtime делают literal union предпочтительным стилем enum в коде Luau.
Задание
ЛегкоСоздайте тип literal union с именем Direction со значениями "up", "down", "left" и "right".
Создайте четыре переменные, каждая из которых аннотирована типом Direction:
upDirection="up"downDirection="down"leftDirection="left"rightDirection="right"
Выведите на экран, каждое с новой строки:
upDirectiondownDirectionleftDirectionrightDirection- сообщение
The player moves left, сформированное с помощью интерполяции строк изleftDirection
Попробуйте сами
-- Напишите код здесь
-- 1) определите тип Direction как объединение четырёх строковых литералов
-- 2) создайте четыре аннотированные переменные
-- 3) выведите каждую, затем интерполированное сообщение
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов8Перечисления в стиле Luau
Паттерн перечислений (Enum) в LuauЧисловые перечисления с помощью таблицСтроковые перечисления как объединенияИспользование перечислений на основе литеральных объединенийЗамораживание константных таблицИтоги: Перечисления в стиле Luau3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словари