Перейти к основному содержимому
  1. Rust/

Перечисления (Enums) в Rust

639 слов·3 минуты· loading · loading · · ·Rust-basic
about-rust - Эта статья часть цикла.
Статей прочитано 0/36
0%
📚 Введение и дополнительные материалы
🟢 Начальный уровень (Rust-basic)
Не прочитана
Не прочитана
11 Перечисления (Enums) в Rust (текущая)
Не прочитана
Не прочитана
Не прочитана
Не прочитана

Введение. Что такое перечисление
#

Перечисления (Enums) в Rust — это тип данных, который позволяет описать сущность, принимающую одно из нескольких возможных значений (вариантов).

Если вы раньше программировали, например, на Java или C++, то наверняка пользовались enums для создания списка констант (например, дней недели). Но в Rust перечисления намного мощнее! Они позволяют хранить разнородные данные внутри каждого варианта, благодаря чему код становится чистым и безопасным.

Варианты конструирования (внутренний синтаксис)
#

В отличие от многих других языков, где перечисления — это просто список именованных целых чисел, в Rust варианты enums могут содержать в себе данные различного типа и структуры. Один enum может содержать три вида вариантов:

  1. Юнит-варианты: без связанных данных (аналогично юнит-структурам).
  2. Кортежные варианты: со связанными безымянными данными в круглых скобках (аналогично структурам-кортежам).
  3. Структурные варианты: с именованными полями в фигурных скобках {} (аналогично обычным структурам).

Давайте посмотрим, как объявляются варианты, что такое незаселенный тип и как извлечь данные с помощью match на интерактивных слайдах ниже:

Работа с перечислениями в Rust
Шаг 1/3
 1#[allow(dead_code)]
 2#[derive(Debug)]
 3enum WebEvent {
 4    // Юнит-вариант (без связанных данных)
 5    PageLoad,
 6    // Кортежный вариант (со связанными безымянными данными)
 7    KeyPress(char),
 8    // Структурный вариант (с именованными полями)
 9    Click { x: i64, y: i64 },
10}
11
12fn main() {
13    let load = WebEvent::PageLoad;
14    let press = WebEvent::KeyPress('q');
15    let click = WebEvent::Click { x: 320, y: 240 };
16
17    println!("load: {:?}", load);
18    println!("press: {:?}", press);
19    println!("click: {:?}", click);
20}

Варианты конструирования перечислений

  • Перечисления (enums) могут объединять данные разных форматов под одним типом.
  • Юнит-варианты не несут связанных данных (PageLoad).
  • Кортежные варианты хранят неименованные данные в круглых скобках (KeyPress).
  • Структурные варианты хранят именованные поля в фигурных скобках (Click).

Детали реализации:
#

  • Шаг 1. Варианты конструирования: Мы создали перечисление WebEvent, демонстрирующее все три типа вариантов. Важная деталь: все поля и данные внутри вариантов перечисления автоматически являются публичными, писать pub перед ними не нужно.
  • Шаг 2. Пустые перечисления: В Rust можно объявить enum вообще без вариантов (например, enum EmptyEnum {}). Создать объект такого типа в обычном коде невозможно. Зачем это нужно? Обычно так помечают состояния, которые никогда не должны произойти физически, помогая компилятору оптимизировать проверки.
  • Шаг 3. Достаем данные (Pattern Matching): Так как разные варианты перечисления могут содержать абсолютно разные типы данных, компилятор не разрешит обратиться к ним напрямую. Нам нужно проверить, какой именно вариант сейчас активен. Самый удобный способ сделать это — конструкция match.

Важная деталь: Конструкция match в Rust является исчерпывающей (exhaustive). Это означает, что компилятор выдаст ошибку, если хотя бы один из вариантов enums не будет обработан в ветках match.


Проверь свои знания!
#

Пройдите короткий интерактивный тест, чтобы закрепить понимание перечислений в Rust.

История обновлений

  • Установил уровень сложности rust-middle для статьи.
  • Добавил интерактивные слайды с запускаемым кодом примеров и тесты по перечислениям.
Статья прочитана
Пожалуйста, оцените насколько статья была вам полезна и понятна
Цикл статей
about-rust - Эта статья часть цикла.
Статей прочитано 0/36
0%
📚 Введение и дополнительные материалы
🟢 Начальный уровень (Rust-basic)
Не прочитана
Не прочитана
11 Перечисления (Enums) в Rust (текущая)
Не прочитана
Не прочитана
Не прочитана
Не прочитана

Связанные статьи