Введение. Что такое перечисление#
Перечисления (Enums) в Rust — это тип данных, который позволяет описать сущность, принимающую одно из нескольких возможных значений (вариантов).
Если вы раньше программировали, например, на Java или C++, то наверняка пользовались enums для создания списка констант (например, дней недели). Но в Rust перечисления намного мощнее! Они позволяют хранить разнородные данные внутри каждого варианта, благодаря чему код становится чистым и безопасным.
Варианты конструирования (внутренний синтаксис)#
В отличие от многих других языков, где перечисления — это просто список именованных целых чисел, в Rust варианты enums могут содержать в себе данные различного типа и структуры. Один enum может содержать три вида вариантов:
- Юнит-варианты: без связанных данных (аналогично юнит-структурам).
- Кортежные варианты: со связанными безымянными данными в круглых скобках (аналогично структурам-кортежам).
- Структурные варианты: с именованными полями в фигурных скобках
{}(аналогично обычным структурам).
Давайте посмотрим, как объявляются варианты, что такое незаселенный тип и как извлечь данные с помощью match на интерактивных слайдах ниже:
Детали реализации:#
- Шаг 1. Варианты конструирования: Мы создали перечисление
WebEvent, демонстрирующее все три типа вариантов. Важная деталь: все поля и данные внутри вариантов перечисления автоматически являются публичными, писатьpubперед ними не нужно. - Шаг 2. Пустые перечисления: В Rust можно объявить
enumвообще без вариантов (например,enum EmptyEnum {}). Создать объект такого типа в обычном коде невозможно. Зачем это нужно? Обычно так помечают состояния, которые никогда не должны произойти физически, помогая компилятору оптимизировать проверки. - Шаг 3. Достаем данные (Pattern Matching): Так как разные варианты перечисления могут содержать абсолютно разные типы данных, компилятор не разрешит обратиться к ним напрямую. Нам нужно проверить, какой именно вариант сейчас активен. Самый удобный способ сделать это — конструкция
match.
Важная деталь: Конструкция
matchв Rust является исчерпывающей (exhaustive). Это означает, что компилятор выдаст ошибку, если хотя бы один из вариантов enums не будет обработан в веткахmatch.
Проверь свои знания!#
Пройдите короткий интерактивный тест, чтобы закрепить понимание перечислений в Rust.
История обновлений
- Установил уровень сложности rust-middle для статьи.
- Добавил интерактивные слайды с запускаемым кодом примеров и тесты по перечислениям.

