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

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

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

Speaker Notes

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). Це рідко використовується, але може бути корисним у більш складних шаблонах.