Использование Match-Pattern matching в Rust#
Введение:#
В языке программирования Rust, match
является мощной конструкцией, которая позволяет сравнивать значение с серией шаблонов и выполнять код в зависимости от совпадения. Рассмотрим различные виды и применения match
.
Типы паттерн матчинга:#
- Простой Match:
Простой
match
в Rust сравнивает значение с серией шаблонов и выполняет код, соответствующий первому совпавшему шаблону.
let value = 1;
match value {
1 => println!("one"),
2 => println!("two"),
_ => println!("anything"),
}
- Match с Деструктуризацией:
match
также может использоваться для деструктуризации значений в более сложных типах данных, таких как кортежи, структуры или перечисления.
let pair = (0, -2);
match pair {
(0, y) => println!("First is `0` and `y` is `{:?}`", y),
(x, 0) => println!("`x` is `{:?}` and last is `0`", x),
_ => println!("It doesn't matter what they are"),
}
- Match с Условиями:
Условия в
match
позволяют уточнить шаблон с помощью произвольных условий. Это позволяет добавить дополнительные условия для шаблона.
match pair {
(x, y) if x == y => println!("These are twins"),
(x, y) if x + y == 0 => println!("These are inverses"),
(x, _) if x % 2 == 1 => println!("The first one is odd"),
_ => println!("No correlation..."),
}
- Match с Перечислениями:
match
также часто используется с перечислениями. Это позволяет обрабатывать разные варианты перечисления и извлекать связанные данные.
enum Color {
Red,
Blue,
Green,
RGB(u32, u32, u32),
}
let color = Color::RGB(122, 17, 40);
match color {
Color::Red => println!("Red"),
Color::Blue => println!("Blue"),
Color::Green => println!("Green"),
Color::RGB(r, g, b) => println!("RGB: {}, {}, {}", r, g, b),
}
Еще один интересный пример:#
Пусть у нас есть enum Exercise, которое представляет различные типы упражнений, доступных в приложении.
enum Exercise {
Run { distance: f64 },
Swim { duration: u32 },
Yoga,
}
Мы можем использовать match для обработки различных типов упражнений и выполнения различных действий в зависимости от типа упражнения.
fn process_exercise(exercise: Exercise) {
match exercise {
Exercise::Run { distance } => {
println!("Ты пробежал {} км. сегодня. Отлично!", distance);
},
Exercise::Swim { duration } => {
println!("Ты плавал {} минут сегодня. Продолжай в том же духе!", duration);
},
Exercise::Yoga => {
println!("Отличная работа, ты выполнил свою норму йоги на сегодня!");
}
}
}
В этом примере match позволяет нам безопасно обработать различные типы упражнений и извлечь связанные с ними данные.
Полный код приложения: ссылка на онлайн компилятор
enum Exercise {
Run { distance: f64 },
Swim { duration: u32 },
Yoga,
}
fn process_exercise(exercise: Exercise) {
match exercise {
Exercise::Run { distance } => {
println!("Ты пробежал {} км. сегодня. Отлично!", distance);
},
Exercise::Swim { duration } => {
println!("Ты плавал {} минут сегодня. Продолжай в том же духе!", duration);
},
Exercise::Yoga => {
println!("Отличная работа, ты выполнил свою норму йоги на сегодня!");
}
}
}
fn main() {
process_exercise(Exercise::Run{distance:100.0});
process_exercise(Exercise::Swim{duration:100});
process_exercise(Exercise::Yoga);
}
Шаблоны match позволяют обрабатывать различные варианты и извлекать связанные данные, все это безопасно и эффективно. Это дает нам возможность легко обрабатывать различные случаи и извлекать данные из сложных типов, сохраняя при этом чистоту и ясность кода.
Когда мы используем match, мы не только упрощаем наш код, но и делаем его более надежным. С помощью match мы можем быть уверены, что обработали все возможные варианты, иначе компилятор выдаст предупреждение.
Заключение:#
match
в Rust - это мощный инструмент, который делает код более ясным и безопасным. Он позволяет обрабатывать различные случаи и извлекать данные из сложных типов в удобной и безопасной манере.
Также я очень рад что механизм паттерн матчинга появился с версии 3 в dart. Там используется ключевое слово switch
. Еще нельзя будет не упомянуть что в языке Elixir шаблоны match используются постоянно.
Если найду еще интересные варианты применения этого механизма обязательно опубликую.