Использование match guards в Rust

RustRustBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабе мы узнаем, как использовать match guards в Rust для фильтрации ветвей на основе условий. Match guard добавляется после шаблона и представляется ключевым словом if, за которым следует условие. Условие guard позволяет нам дополнительно уточнить сопоставление шаблонов и выполнить дополнительные проверки перед выполнением соответствующей ветви match-выражения. Однако важно помнить, что компилятор не учитывает условия guard при проверке покрытия шаблонов, поэтому необходимо убедиться, что все шаблоны по-прежнему покрываются match-выражением.

Примечание: Если в лабе не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.

Guards

Можно добавить match guard, чтобы отфильтровать ветвь.

#[allow(dead_code)]
enum Temperature {
    Celsius(i32),
    Fahrenheit(i32),
}

fn main() {
    let temperature = Temperature::Celsius(35);
    // ^ TODO попробуйте разные значения для `temperature`

    match temperature {
        Temperature::Celsius(t) if t > 30 => println!("{}C is above 30 Celsius", t),
        // Часть `if condition` ^ - это guard
        Temperature::Celsius(t) => println!("{}C is below 30 Celsius", t),

        Temperature::Fahrenheit(t) if t > 86 => println!("{}F is above 86 Fahrenheit", t),
        Temperature::Fahrenheit(t) => println!("{}F is below 86 Fahrenheit", t),
    }
}

Обратите внимание, что компилятор не будет учитывать условия guard при проверке, покрываются ли все шаблоны match-выражением.

fn main() {
    let number: u8 = 4;

    match number {
        i if i == 0 => println!("Zero"),
        i if i > 0 => println!("Greater than zero"),
        // _ => unreachable!("Should never happen."),
        // TODO ^ раскомментируйте, чтобы исправить компиляцию
    }
}

Резюме

Поздравляем! Вы завершили лабу по Guards. Вы можете практиковаться в других лабах в LabEx, чтобы улучшить свои навыки.