Співставлення значень

Ключове слово match дозволяє зіставити значення з одним або декількома шаблонами. Порівняння відбуваються зверху вниз, і виграє перший збіг.

Шаблони можуть бути простими значеннями, подібно до switch у C та C++:

#[rustfmt::skip]
fn main() {
    let input = 'x';
    match input {
        'q'                       => println!("Виходжу"),
        'a' | 's' | 'w' | 'd'     => println!("Пересування"),
        '0'..='9'                 => println!("Введення числа"),
        key if key.is_lowercase() => println!("Нижній регістр: {key}"),
        _                         => println!("Щось інше"),
    }
}

Шаблон _ - це шаблон підстановки, який відповідає будь-якому значенню. Вирази повинні бути вичерпними, тобто охоплювати всі можливі варіанти, тому _ часто використовується як остаточний всеохоплюючий випадок.

Match можна використовувати як вираз. Як і у випадку з if, кожна гілка зіставлення повинно мати однаковий тип. Тип - це останній вираз у блоці, якщо такий є. У наведеному вище прикладі тип ().

Змінна у шаблоні (у цьому прикладі - key) створить прив'язку, яку можна використовувати у гілці зіставлення.

Запобіжник зіставлення призводить до гілці зіставлення, тільки якщо умова істинна.

This slide should take about 10 minutes.

Ключові моменти:

  • Ви можете вказати, як деякі конкретні символи використовуються в шаблоні

    • | як or
    • .. може розширюватися настільки, наскільки це потрібно
    • 1..=5 представляє включний діапазон
    • _ - символ підстановки
  • Запобіжники зіставлення як окрема функція синтаксису є важливою та необхідною, коли ми хочемо стисло висловити більш складні ідеї, ніж це дозволили б самі шаблони.

  • Це не те саме, що окремий вираз if всередині гілкі зіставлення. Вираз if всередині блоку розгалуження (після =>) виникає після вибору гілкі зіставлення. Невиконання умови if всередині цього блоку не призведе до розгляду інших частин вихідного виразу match.

  • Умова, визначена в запобіжнику, застосовується до кожного виразу в шаблоні з |.

Більше інформації для вивчення

  • Ще одним елементом синтаксису шаблону, який ви можете показати учням, є синтаксис @, який прив'язує частину шаблону до змінної. Наприклад:

    #![allow(unused)]
    fn main() {
    let opt = Some(123);
    match opt {
        outer @ Some(inner) => {
            println!("outer: {outer:?}, inner: {inner}");
        }
        None => {}
    }
    }

    У цьому прикладі inner має значення 123, яке він витягнув з Option за допомогою деструктуризації, outer перехоплює весь вираз Some(inner), тому він містить повний вираз Option::Some(123). Це рідко використовується, але може бути корисним у більш складних шаблонах.