التعدادات مع البيانات
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 14 من 61.
تتيح لك التعدادات الأساسية في Rust تعريف نوع بمجموعة ثابتة من المتغيرات، مثل Direction::North أو Status::Active. لكن تعداديات Rust أقوى بكثير من ذلك. يمكن لكل متغير أن يحمل بياناته الخاصة، مما يجعل التعدادات مرنة للغاية في نمذجة السيناريوهات الواقعية.
تخيّل نظامًا للمراسلة حيث تحمل أنواع مختلفة من message معلومات مختلفة. تحتوي text message على محتوى، ويحمل أمر move إحداثيات، بينما لا تحمل إشارة quit أي شيء على الإطلاق. في Rust، يمكنك تمثيل كل هذه العناصر باستخدام enum واحد:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(u8, u8, u8),
}
Each متغير له شكل مختلف. Quit لا يحمل أي data: إنه مجرد إشارة.
Move يستخدم صياغة شبيهة بالبنى مع حقول named. Write holds قيمة واحدة من String باستخدام صياغة الصفوف. ChangeColor holds ثلاث قيم تمثل مكونات RGB.
يبدو إنشاء مثيلات هذه الأنواع كما يلي:
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
let m3 = Message::Write(String::from("Hello"));
let m4 = Message::ChangeColor(255, 128, 0);
يكمن جمال هذا النهج في أن m1 وm2 وm3 وm4 جميعها من النوع نفسه: Message. يمكنك تخزينها في المجموعة نفسها، أو تمريرها إلى الدالة نفسها، أو إرجاع أي متغير منها من دالة واحدة. تعمل التعدادات على توحيد أشكال البيانات المختلفة ضمن نوع واحد، مع الحفاظ على المعلومات المحددة التي يحتاجها كل متغير.
التحدي
سهللنبنِ نظام إشعارات يستخدم التعدادات مع البيانات لتمثيل أنواع مختلفة من التنبيهات. يحمل كل نوع من الإشعارات معلومات مختلفة: بعضها يحتوي على message، وبعضها يحتوي على قيم رقمية، وبعضها الآخر عبارة عن إشارات بسيطة.
ستنشئ ملفين لتنظيم التعليمات البرمجية:
notification.rs: عرّف تعدادًا عامًا من نوعNotificationمع ثلاثة متغيرات:Alert: يحتوي على message واحد من نوعString(صيغة tuple)Reminder: يحتوي على حقول مسماة:title(String) وminutes(u32)Dismiss: لا يحتوي على بيانات، بل هو مجرد إشارة
main.rs: أضف وحدة الإشعارات وأنشئ مثيلًا واحدًا من كل متغير. ثم اطبع معلومات حول كل إشعار لإظهار أن المتغيرات الثلاثة من النوع نفسه، لكنها تحمل بيانات مختلفة.
عند الطباعة، استخدم تنسيق التصحيح ({:?}) لعرض كل إشعار. ستحتاج إلى اشتقاق السمة Debug في التعداد الخاص بك حتى يمكن طباعته بهذه الطريقة.
يجب أن يُظهر الناتج الإشعارات الثلاثة جميعها، كل إشعار في سطر مستقل:
Alert("{message}")
Reminder { title: "{title}", minutes: {minutes} }
Dismissعلى سبيل المثال، مع message تنبيه بقيمة "Server down"، وتذكير بعنوان "Meeting" و30 دقيقة، سيكون الناتج:
Alert("Server down")
Reminder { title: "Meeting", minutes: 30 }
Dismissستتلقى ثلاثة مدخلات: message التنبيه، وعنوان التذكير، وعدد دقائق التذكير.
جرّب بنفسك
mod notification;
use notification::Notification;
fn main() {
// قراءة المدخلات
let mut alert_message = String::new();
std::io::stdin().read_line(&mut alert_message).expect("Failed to read line");
let alert_message = alert_message.trim().to_string();
let mut reminder_title = String::new();
std::io::stdin().read_line(&mut reminder_title).expect("Failed to read line");
let reminder_title = reminder_title.trim().to_string();
let mut minutes_input = String::new();
std::io::stdin().read_line(&mut minutes_input).expect("Failed to read line");
let reminder_minutes: u32 = minutes_input.trim().parse().expect("Failed to parse minutes");
// TODO: أنشئ إشعار Alert باستخدام alert_message
// TODO: Create a Reminder notification using reminder_title and reminder_minutes
// TODO: أنشئ إشعار Dismiss
// TODO: اطبع كل إشعار باستخدام تنسيق التصحيح {:?}
// يجب طباعة كل إشعار في سطره الخاص
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت