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در الگو استفاده کنید.