0Pricing
Learn Rust Coding · Урок

Сопоставление вариантов перечисления

Используйте match для обработки каждого случая.

«Сопоставление вариантов перечисления» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.

Знакомство с выражением match

Выражение match сравнивает значение с последовательностью шаблонов и выполняет код первого подходящего шаблона.

Оно естественным образом сочетается с перечислениями: каждый вариант можно обработать в отдельной ветви.

enum Light {
    Red,
    Green,
}

fn action(l: Light) {
    match l {
        Light::Red => println!("Stop"),
        Light::Green => println!("Go"),
    }
}

Строение ветви match

Каждая ветвь имеет форму pattern => expression, а ветви разделяются запятыми.

Шаблон определяет, что нужно сопоставить, а выражение после => выполняется при совпадении. Здесь шаблоном является один вариант перечисления.

match light {
    Light::Red => println!("Stop"),
    Light::Green => println!("Go"),
}

Полная программа с сопоставлением

Вот полная программа, которая сопоставляет состояние светофора и выводит инструкцию.

Запустите её, затем измените вариант в main, чтобы увидеть выполнение другой ветви.

enum TrafficLight {
    Red,
    Yellow,
    Green,
}

fn main() {
    let light = TrafficLight::Yellow;
    match light {
        TrafficLight::Red => println!("Stop"),
        TrafficLight::Yellow => println!("Slow down"),
        TrafficLight::Green => println!("Go"),
    }
}

match должен быть исчерпывающим

Rust требует, чтобы match охватывал каждый возможный вариант. Если пропустить один из них, программа не скомпилируется.

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

// This would FAIL to compile because
// the Green case is missing:
// match light {
//     Light::Red => println!("Stop"),
// }

Универсальный шаблон с _

Если Вы не хотите перечислять каждый вариант, используйте символ подчёркивания _ как универсальный шаблон. Он соответствует всему, что не было обработано выше.

Поместите его последним, поскольку ветви проверяются по порядку.

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn main() {
    let c = Coin::Dime;
    match c {
        Coin::Penny => println!("1 cent"),
        _ => println!("Some other coin"),
    }
}

match возвращает значение

match является выражением, поэтому создаёт значение, которое можно сохранить в переменной.

Каждая ветвь должна возвращать один и тот же тип. Обратите внимание: после выражения каждой ветви здесь нет точки с запятой.

enum Coin {
    Penny,
    Quarter,
}

fn main() {
    let coin = Coin::Quarter;
    let cents = match coin {
        Coin::Penny => 1,
        Coin::Quarter => 25,
    };
    println!("{} cents", cents);
}

Многострочные тела ветвей

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

Последнее выражение внутри скобок — это значение, которое возвращает ветвь.

match light {
    Light::Red => {
        println!("Caution!");
        println!("Stop the car");
    }
    Light::Green => println!("Go"),
}

Объединение шаблонов с помощью |

Используйте вертикальную черту |, чтобы сопоставить несколько вариантов в одной ветви. Она читается как «или».

Так не придётся повторять одно и то же тело для вариантов, которые должны обрабатываться одинаково.

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn main() {
    let c = Coin::Nickel;
    match c {
        Coin::Penny | Coin::Nickel => println!("Small coin"),
        _ => println!("Bigger coin"),
    }
}

match в сравнении с if/else

Для проверки вариантов можно выстроить цепочку if / else if, но match понятнее и безопаснее.

При использовании match компилятор проверяет, обработали ли Вы каждый случай. Цепочка инструкций if такой гарантии не даёт.

Сопоставление и вывод одновременно

Распространённый приём — преобразовать вариант в понятную пользователю строку и вывести её.

Запустите эту программу и измените выбранное направление, чтобы увидеть соответствующее сообщение.

enum Direction {
    North,
    South,
    East,
    West,
}

fn main() {
    let d = Direction::West;
    let name = match d {
        Direction::North => "North",
        Direction::South => "South",
        Direction::East => "East",
        Direction::West => "West",
    };
    println!("Heading {}", name);
}

Порядок имеет значение

Ветви проверяются сверху вниз, и срабатывает первая совпавшая. Остальные пропускаются.

Поэтому универсальный шаблон _ должен находиться последним: если бы он стоял первым, то поглотил бы любое значение, не дав сработать конкретным ветвям.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли match.

Итоги

Вы узнали, что match сравнивает значение с шаблонами и выполняет первую совпавшую ветвь.

Выражение должно быть исчерпывающим, может использовать _ как универсальный шаблон, объединять варианты с помощью | и возвращает значение, поскольку является выражением. Далее Вы добавите собственные данные к вариантам перечисления.

Часто задаваемые вопросы

Урок «Сопоставление вариантов перечисления» бесплатный?

Да — полный текст урока «Сопоставление вариантов перечисления» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.

Чему я научусь в уроке «Сопоставление вариантов перечисления»?

Используйте match для обработки каждого случая. Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Сопоставление вариантов перечисления»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Создание первого перечисления
  2. Сопоставление вариантов перечисления
  3. Перечисления с данными
  4. Защитные условия и привязки в match
← Назад к Learn Rust Coding