Matching Values
کلمه کلیدی match
به شما امکان می دهد یک مقدار را در برابر یک یا چند الگو مطابقت دهید. مقایسهها از بالا به پایین انجام میشوند و اولین تطبیق انتخاب میشود.
الگوها می توانند مقادیر ساده ای باشند، شبیه به switch
در C و C++:
#[rustfmt::skip] fn main() { let input = 'x'; match input { 'q' => println!("Quitting"), 'a' | 's' | 'w' | 'd' => println!("Moving around"), '0'..='9' => println!("Number input"), key if key.is_lowercase() => println!("Lowercase: {key}"), _ => println!("Something else"), } }
The _
pattern is a wildcard pattern which matches any value. The expressions must be exhaustive, meaning that it covers every possibility, so _
is often used as the final catch-all case.
Match can be used as an expression. Just like if
, each match arm must have the same type. The type is the last expression of the block, if any. In the example above, the type is ()
.
A variable in the pattern (key
in this example) will create a binding that can be used within the match arm.
A match guard causes the arm to match only if the condition is true.
نکات کلیدی:
-
بهتر است که اشاره کنید چطوری میتوان از کاراکترهای خاص در الگو استفاده کرد:
|
به عنوانor
..
برای تعیین همه محدوده یا تا جایی که میتوان گسترش یابد1..=5
نمایانگر یک محدوده خاص است._
یک wildcard (هر حالتی) است.
-
گارد های تطبیق به عنوان یک ویژگی سینتکس جداگانه دسته بندی میشوند, زمانی مهم و ضروری هستند که بخواهیم ایده های پیچیده تر از الگوهای ساده بیان کنیم.
-
آنها با عبارت
if
جداگانه ای در داخل یک شاخه تطبیق هستند یکسان نیستند. یک عبارتif
در داخل بلاک شاخه (پس از=>
) پس از ورود به اون شاخه خاص صدا زده میشود. اگر شرطif
برقرار نباشد کاری به سایر شاخه های عبارتmatch
اصلی ندارد. -
شرط تعریف شده در guard با کمک
|
به شرط های تطبیق الگو اضافه میشود.