Enums، مخفف enumerations و یک ساختار داده قدرتمند در زبان برنامه نویسی Rust است. Enumهای Rust، بسیار متنوعتر از آنهایی هستند که در بسیاری از زبانهای برنامه نویسی دیگر یافت میشوند و به شما این امکان را میدهند که دادههای پیچیده را با تطبیق الگو و مدیریت خطا، مدل سازی کنید. در این مقاله به اصول اولیهی enums در Rust، موارد استفادهی از آنها و چند مثال کاربردی خواهیم پرداخت.
تعریف Enums در Rust
Enumها در Rust، با استفاده از کلمهی کلیدی enum و به دنبال آن، نام enumeration تعریف میشوند. هر enum میتواند صفر یا بیشتر، مقادیر مرتبط با انواع دادههای مختلف را داشته باشد. در اینجا یک مثال ساده آورده شدهاست:
enum Direction {
North,
East,
South,
West,
}
Rust به enumها اجازه میدهد تا دادههای مرتبطی را داشته باشند و آنها را به ابزاری قدرتمند، برای مدل سازی ساختارهای داده پیچیده، تبدیل میکند. در اینجا یک مثال از یک enum که اشکال مختلفی را نشان میدهد، مشاهده میکنید:
enum Shape {
Circle(f64),
Rectangle(f64, f64),
Square(f64),
}
در این مثال، نوع Circle دارای یک مقدار ورودی برای شعاع است؛ در حالیکه نوع Rectangle دارای دو مقدار ورودی است که نشان دهندهی عرض و ارتفاع است. نوع Square دارای یک مقدار ورودی برای طول ضلع خود است.
Pattern Matching در Enums
** Pattern Matching ** در ادامه مطالب به صورت کامل صحبت خواهد شد .
قابلیت Pattern Matching به ویژه هنگام کار با enums مفید است. میتوانید از کلمهی کلیدی match برای destructure و مطابقت با انواع enum استفاده کنید که به شما امکان میدهد، کد مختصر و خوانایی را بنویسید. در اینجا یک مثال، با استفاده از Shape enum آورده شدهاست:
fn area(shape: Shape) -> f64 {
match shape {
Shape::Circle(radius) => std::f64::consts::PI * radius * radius,
Shape::Rectangle(width, height) => width * height,
Shape::Square(side) => side * side,
}
}
استفاده از Enum در Error Handling
Enumها معمولاً در Rust، برای رسیدگی به خطا استفاده میشوند؛ به لطف Result ارائه شده توسط کتابخانهی استاندارد. Enum مربوط به Result، دو نوع را دارد: Ok برای نتایج موفق و Err برای خطاها. در اینجا نمونهای از استفادهی از Result را در تابعی که دادهها را از یک فایل میخواند، مشاهده میکنید:
**Result ** در ادامهی مطالب به صورت کامل صحبت خواهد شد. در اینجا هدف فقط نشان دادن کاربردهای Enum است:
use std::io::Read;
use std::fs::File;
use std::io;
fn read_file_contents(file_path: &str) -> Result<String, io::Error> {
let mut file = File::open(file_path)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
Ok(contents)
}
Enums و Optionality
یکی دیگر از موارد استفادهی رایج برای enums در Rust، نمایش مقادیر اختیاری است که توسط Option enum ارائه شدهی توسط کتابخانهی استاندارد، تسهیل میشود. Option enum دو نوع دارد: برخی برای مقادیر فعلی و None برای مقادیر غایب. در اینجا مثالی از استفادهی از Option enum، برای پیاده سازی یک پشتهی ساده آورده شدهاست:
**Option ** در ادامه مطالب به صورت کامل صحبت خواهد شد. در اینجا هدف فقط نشان دادن کاربردهای Enum است:
struct Stack<T> {
elements: Vec<T>,
}
impl<T> Stack<T> {
fn new() -> Self {
Stack { elements: Vec::new() }
}
fn push(&mut self, item: T) {
self.elements.push(item);
}
fn pop(&mut self) -> Option<T> {
self.elements.pop()
}
}
Enums در Rust، یک ویژگی قدرتمند است که به شما امکان میدهد ساختارهای دادهی پیچیده را مدل سازی کنید و به راحتی خطاها را مدیریت کنید. با استفاده از قدرت enums، Pattern Matching ، و فهرستهای داخلی کتابخانهی استاندارد مانند Result و Option میتوانید از قدرت Enumها استفاده کنید.