enum
التعدادات enum
enum يعرّف نوعًا بمجموعة متغيّرات محدودة، وقد يحمل كل متغيّر بياناته الخاصة — أقوى بكثير من تعدادات اللغات الأخرى.
خلافًا لتعدادات C أو Java البسيطة، متغيّرات enum في Rust يمكن أن تحمل بيانات مختلفة الشكل: بدون بيانات، أو صفّ قيم، أو حقول مسمّاة كأنها هيكل مصغّر. هذا يجعل enum أداة قوية لتمثيل «قيمة من بين عدّة أشكال ممكنة» بأمان كامل وقت الترجمة.
Option و Result من المكتبة القياسية أمثلة شهيرة على enum يحمل بيانات: Option<T> تمثّل وجود قيمة أو غيابها، وResult<T, E> تمثّل نجاحًا أو فشلًا.
الصياغة
enum Name {
Variant1,
Variant2(Type),
Variant3 { field: Type },
}📄 مثال
enum Shape {
Circle(f64),
Rectangle(f64, f64),
Point,
}
let s = Shape::Circle(2.0);
let area = match s {
Shape::Circle(r) => 3.14 * r * r,
Shape::Rectangle(w, h) => w * h,
Shape::Point => 0.0,
};أهم النقاط
| العنصر | الوظيفة |
|---|---|
| Variant | متغيّر بدون بيانات إضافية |
| Variant(T, T) | متغيّر يحمل قيمًا بلا أسماء (شبيه tuple) |
| Variant { f: T } | متغيّر يحمل حقولًا مسمّاة |
| Enum::Variant | الوصول لمتغيّر عبر اسم النوع |
💡 نصائح عملية
- استخدم enum بدل عدّة متغيّرات bool منفصلة لتمثيل حالة واحدة من بين خيارات متعدّدة
- اجمع بيانات كل حالة داخل متغيّرها مباشرة بدل هياكل منفصلة متفرّقة
⚠️ أخطاء شائعة
- الظن أن enum في Rust مجرّد أرقام صحيحة مسمّاة كما في C — هي أقوى بكثير وتحمل بيانات
- نسيان تغطية كل المتغيّرات داخل match — المترجم يرفض المطابقة غير الشاملة
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار RUST الكامل بالعربي.