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