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

Pattern matсhing

606 слов·3 минут· loading · loading · ·
Rust Dev
Оглавление
about-rust - Эта статья часть цикла.
Часть 10: Эта статья

Использование Match-Pattern matching в Rust
#

Введение:
#

В языке программирования Rust, match является мощной конструкцией, которая позволяет сравнивать значение с серией шаблонов и выполнять код в зависимости от совпадения. Рассмотрим различные виды и применения match.

Типы паттерн матчинга:
#

  1. Простой Match: Простой match в Rust сравнивает значение с серией шаблонов и выполняет код, соответствующий первому совпавшему шаблону.
let value = 1;

match value {
    1 => println!("one"),
    2 => println!("two"),
    _ => println!("anything"),
}
  1. 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"),
}
  1. 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..."),
}
  1. 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 используются постоянно.

Если найду еще интересные варианты применения этого механизма обязательно опубликую.

about-rust - Эта статья часть цикла.
Часть 10: Эта статья

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

Basic rust
326 слов·2 минут· loading · loading
Rust Dev