Enums

مانند tuple ها، enum ها را نیز می توان با تطبیق تخریب کرد:

الگوها همچنین می‌توانند برای متصل کردن متغیرها به بخش‌هایی از مقادیر شما استفاده شوند. این روش به شما اجازه می‌دهد ساختار انواع خود را بررسی کنید. بیایید با یک نوع ساده enum شروع کنیم:

enum Result {
    Ok(i32),
    Err(String),
}

fn divide_in_two(n: i32) -> Result {
    if n % 2 == 0 {
        Result::Ok(n / 2)
    } else {
        Result::Err(format!("نمی توان  {n}  را به دو قسمت مساوی تقسیم کرد"))
    }
}

fn main() {
    let n = 100;
    match divide_in_two(n) {
        Result::Ok(half) => println!("{n} تقسیم به دو است {half}"),
        Result::Err(msg) => println!("با عرض‌پوزش، خطایی رخ داده است: {msg}"),
    }
}

اینجا از شاخه‌ها برای تجزیه مقدار Result استفاده کرده‌ایم. در شاخه‌ی اول، half به مقداری که درون حالت Ok قرار دارد متصل شده است. در شاخه‌ی دوم، msg به پیام خطا متصل شده است.

This slide should take about 4 minutes.
  • عبارت if/else یک نوع enum بازمی‌گرداند که بعداً با استفاده از match از هم باز می‌شود.
  • می توانید با اضافه کردن یک فیلد دیگر None به enum اضافه کنید و نمایش خطاها هنگام اجرای کد، را تست کنید. مکان هایی را که کد شما اکنون ناقص است و نحوه تلاش کامپایلر برای ارائه نکاتی به شما را نشان دهید.
  • مقادیر در حالات enum تنها پس از تطبیق الگو قابل دسترسی هستند.
  • نشان دهید چه اتفاقی می‌افتد وقتی جستجو (مطابقت) ناقص است. به مزیتی که کامپایلر Rust فراهم می‌کند، اشاره کنید که تأیید می‌کند همه حالات پوشش داده شده‌اند.
  • نتیجه‌ی تابع divide_in_two را در متغیر result ذخیره کنید و آن را در یک حلقه با استفاده از match بررسی کنید. این کد کامپایل نمی‌شود زیرا msg هنگام مطابقت مصرف می‌شود. برای رفع این مشکل، به جای result از result& استفاده کنید. این کار باعث می‌شود msg به صورت یک ارجاع باشد و مصرف نشود. این ویژگی که به نام "match ergonomics" شناخته می‌شود، در Rust 2018 معرفی شده است. اگر می‌خواهید از نسخه‌های قدیمی‌تر Rust پشتیبانی کنید، به جای msg از ref msg در الگو استفاده کنید.