Сопоставление вариантов перечисления
Используйте 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 — локальная установка не требуется.
Все уроки этого курса
- Создание первого перечисления
- Сопоставление вариантов перечисления
- Перечисления с данными
- Защитные условия и привязки в match