Использование 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 используются постоянно.
Если найду еще интересные варианты применения этого механизма обязательно опубликую.