إعلان enum
enum يُعلن نوعًا قيمه مجموعة ثابتة من المتغيِّرات المُسمّاة:
enum Status {
ready,
failed,
}
الآن Status نوع له قيمتان فقط: Status.ready وStatus.failed. لا شيء آخر يمكن أن يكون Status.
الصياغة صغيرة عمدًا:
enum Name {يفتح الإعلان.- كل سطر يذكر اسم متغيِّر واحد، مفصولة بفواصل.
}يُغلقه.
لا حمولات، ولا قيم تمييز، ولا دوال مُشتقّة — هذا ما يُبقي enum "نوع المجموع الصغير" في Zero.
استخدام enum
تُسمّي متغيِّرًا بتأهيله بنوع التعداد:
let state: Status = Status.ready
التعليق : Status اختياري بمجرّد أن يُثبّت الجانب الأيمن النوع؛ في معظم الحالات تستطيع كتابة:
let state = Status.ready
ويستنتج المترجم أن النوع هو Status.
مقارنة قيم enum
قيمتا enum متساويتان عندما يكونان المتغيِّر نفسه:
if state == Status.ready {
check world.out.write("ready\n")
} else {
check world.out.write("not ready\n")
}
هذه أبسط طريقة للتفرّع على enum. للتحليل الشامل — معالجة كل متغيِّر صراحة — استخدم match:
match state {
.ready => { check world.out.write("ready\n") }
.failed => { check world.out.write("failed\n") }
}
تظهر مزايا match على if/else if عندما تُضيف متغيِّرًا ثالثًا لاحقًا. سيُخبرك المترجم بكل match ينقصه الحالة الجديدة؛ أمّا سلسلة if/else فستمرّ بصمت إلى فرعها الافتراضي.
Choice و match يُغطّي match بمزيد من التفصيل. يعمل لكلٍّ من enum وchoice.
مثال متكامل
العيّنة الرسمية لـ Zero تضع enum وchoice جنبًا إلى جنب في الملف نفسه:
Status لا تفعل شيئًا في هذا المقتطف — هي موجودة لإظهار التباين. متغيِّر choice يربط حمولة (value، message) عند المطابقة؛ ومتغيِّر enum لا يربط شيئًا لأن لا شيء يُربَط.
Enum مقابل Choice: شجرة قرار سريعة
قاعدة قصيرة:
- المتغيِّرات مجرّد تسميات →
enum. - المتغيِّرات يجب أن تحمل بيانات →
choice.
إن كنت تُنمذج حالات دورة حياة واحتجت لاحقًا لربط رسالة خطأ بحالة "failed"، بدّل النوع من enum إلى choice. تحصل المتغيِّرات على نوع حمولة لكلٍّ منها، وتكتسب فروع match التابعة ربطًا لتلك الحمولة. إنها إعادة هيكلة يُرشدك إليها المترجم.
عمليًا:
// قبل — enum، بلا حمولات
enum Status {
ready,
failed,
}
// بعد — choice مع حمولات على كل متغيِّر
choice Status {
ready: Void,
failed: String,
}
المتغيِّرات التي حمولتها Void مجرّد تسميات في شكل choice. تستطيع استخدام enum وchoice لنفس الحالات المنطقية؛ اختر enum عندما لا تحتاج فعلًا لبيانات مرفقة.
حالات الاستخدام
بعض الأمثلة اليومية حيث enum هي الإجابة الصحيحة:
- دورة حياة بلا بيانات وصفية.
Loading،Ready،Empty— حالات بحتة، بلا حمولات. - أنماط.
Read،Write،Appendلنمط فتح ملف. - اتّجاه.
North،South،East،West. - مستوى سجلّ.
Trace،Debug،Info،Warn،Error. (قد تُضيف رسالة لاحقًا، وحينها تتحوّل إلىchoice.) - يوم الأسبوع. مثال تقليدي.
كلّما كنت ستلجأ إلى ثابت عدد سحري (0 = منتظر، 1 = نشط، 2 = منتهٍ)، enum تقريبًا دائمًا أوضح.
ملاحظات أسلوبية
- أسماء متغيِّرات بأحرف صغيرة تتطابق مع أسلوب Zero للمُعرِّفات في بقية اللغة.
- فاصلة لاحقة بعد المتغيِّر الأخير مقبولة (ومستحسنة لتسهيل الفروق في git — إضافة متغيِّر جديد لا يُربك السطر السابق).
- أبقِ قوائم enum صغيرة. إن كان لديك اثنا عشر متغيِّرًا ويريد كثير منها حمولات، فقد تنظر إلى
choice— أو إعادة تصميم — بدلًا منenumأكبر.
التالي: Choice و Match
الخطوة الطبيعية التالية هي الابن الأغنى: choice وmatch — نوع الاتّحاد الموسوم في Zero وبنية مطابقة الأنماط المرافقة له.
الأسئلة الشائعة
ما هو enum في Zero؟
enum يُعلن نوعًا قيمه واحدة من مجموعة ثابتة من المتغيِّرات المُسمّاة — تسميات بلا حمولة إضافية. مثلًا: enum Status { ready, failed }. قيمة من النوع Status هي إمّا Status.ready أو Status.failed فقط، والمترجم يفرض ذلك.
كيف يختلف enum عن choice؟
متغيِّرات enum تسميات بسيطة — لا تحمل بيانات. أمّا choice فاتّحاد موسوم — كل متغيِّر له نوع حمولة مرتبط به، مثل choice Result { ok: i32, err: String }. استخدم enum عندما تحتاج فقط للتمييز بين الحالات بالاسم؛ واستخدم choice عندما تحمل كل حالة معلومة إضافية.
كيف تتحقّق من المتغيِّر الذي يحمله قيمة enum؟
قارن القيمة بالمتغيِّر: if status == Status.ready { ... }. للتفرّع الشامل على كل المتغيِّرات، استخدم match — سيُحذّرك المترجم إن نسيت متغيِّرًا، وهذا السبب الرئيسي لتفضيل match على سلاسل if/else if عندما تكون القيمة نوع مجموع.
هل يمكن لمتغيِّرات enum أن تحمل قيمًا مرتبطة في Zero؟
لا — هذا ما من أجله choice. enum هو نوع المجموع الأدنى عمدًا: كل متغيِّر مجرّد تسمية. إن احتجت لربط i32 أو String بأحد المتغيِّرات، فقد تجاوزت enum وتريد choice.
متى يجب استخدام enum في Zero؟
استخدم enum عندما يجب أن تكون قيمة واحدة من مجموعة صغيرة مُسمّاة من الحالات ولا تحمل تلك الحالات بيانات إضافية. أمثلة: يوم الأسبوع، لون إشارة المرور، حالة دورة حياة بلا بيانات وصفية، مستوى سجلّ. إن وجدت نفسك تريد ربط بيانات بأحد المتغيِّرات، انتقل إلى choice.