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.

This slide should take about 10 minutes.

نکات کلیدی:

  • بهتر است که اشاره کنید چطوری میتوان از کاراکترهای خاص در الگو استفاده کرد:

    • | به عنوان or
    • .. برای تعیین همه محدوده یا تا جایی که میتوان گسترش یابد
    • 1..=5 نمایانگر یک محدوده خاص است.
    • _ یک wildcard (هر حالتی) است.
  • گارد های تطبیق به عنوان یک ویژگی سینتکس جداگانه دسته بندی می‌شوند, زمانی مهم و ضروری هستند که بخواهیم ایده های پیچیده تر از الگوهای ساده بیان کنیم.

  • آنها با عبارت if جداگانه ای در داخل یک شاخه تطبیق هستند یکسان نیستند. یک عبارت if در داخل بلاک شاخه (پس از =>) پس از ورود به اون شاخه خاص صدا زده میشود. اگر شرط if برقرار نباشد کاری به سایر شاخه های عبارت match اصلی ندارد.

  • شرط تعریف شده در guard با کمک | به شرط های تطبیق الگو اضافه می‌شود.