تطابق مقادیر

کلمه کلیدی 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!("یک چیز دیگر"),
    }
}

الگوی _ یک الگوی عام (Wildcard) است که با هر مقداری مطابقت دارد. عبارت‌ها باید جامع باشند، به این معنی که همه احتمالات را پوشش دهند، بنابراین _ اغلب به عنوان آخرین حالت برای پوشش تمامی موارد استفاده می‌شود.

match می‌تواند به عنوان یک عبارت استفاده شود. دقیقاً مانند if، هر شاخه match باید از یک تایپ باشد. تایپ بازگشتی، تایپ آخرین عبارت در بلاک است، اگر وجود داشته باشد. در مثال بالا، تایپ بازگشتی () است.

یک متغیر در الگو (key در این مثال) یک اتصال ایجاد می‌کند که می‌توان از آن در بخش مطابقت استفاده کرد.

یک guard در عبارت match باعث می‌شود که آن شاخه تنها در صورتی مطابقت داشته باشد که شرط برقرار باشد.

This slide should take about 10 minutes.

نکات کلیدی:

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

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

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

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