Співставлення значень
Ключове слово 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
) створить прив'язку, яку можна використовувати у гілці зіставлення.
Запобіжник зіставлення призводить до гілці зіставлення, тільки якщо умова істинна.
Ключові моменти:
-
Ви можете вказати, як деякі конкретні символи використовуються в шаблоні
|
як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)
. Це рідко використовується, але може бути корисним у більш складних шаблонах.