الأساليب (Methods) في التعدادات
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 15 من 61.
تمامًا مثل الهياكل، يمكن أن تحتوي التعدادات على أساليب مُعرَّفة داخل كتل impl. يتيح لك ذلك إرفاق السلوك مباشرةً بنوع التعداد، مما يسهّل التعامل مع المتغيرات المختلفة من خلال واجهة موحّدة.
إليك كيفية إضافة method إلى Message enum من الدرس السابق:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
}
impl Message {
fn describe(&self) -> String {
match self {
Message::Quit => String::from("Quit signal"),
Message::Move { x, y } => format!("Move to ({}, {})", x, y),
Message::Write(text) => format!("Message: {}", text),
}
}
}
تعمل كتلة impl Message تمامًا كما تعمل مع الهياكل. تأخذ الطريقة &self للوصول إلى نسخة التعداد. داخل الطريقة، تستخدم match لتحديد المتغير الذي تتعامل معه وإرجاع النتيجة المناسبة.
يبدو استدعاء method بالطريقة نفسها بغضّ النظر عن variant الذي لديك:
fn main() {
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
println!("{}", m1.describe()); // إشارة Quit
println!("{}", m2.describe()); // Move إلى (10, 20)
}
هذا النمط قوي لأن المستدعي لا يحتاج إلى معرفة أي variant لديه. ما عليه سوى استدعاء method، ويتولى enum بقية المهمة داخليًا. يتغير السلوك بناءً على variant، لكن تظل الواجهة متسقة.
التحدي
سهللنَبْنِ نظام إشارة مرور يستخدم تعدادًا مع أساليب لوصف حالة الإشارة الحالية. سيحمل كل لون من ألوان الإشارة معلومات حول مدة استمراره، وسيقدّم أسلوب وصفًا مقروءًا للبشر.
ستنشئ ملفين لتنظيم شفرتك:
traffic.rs: عرّف تعدادTrafficLightعامًا مع ثلاثة متغيرات:Red: يحتوي علىu32يمثّل عدد الثواني للانتظارYellow: يحتوي علىu32يمثّل عدد الثواني للانتظارGreen: يحتوي علىu32يمثّل عدد الثواني للسماح بالمرور
statusيعيد قيمةStringتصف الإشارة. استخدمmatchداخل الأسلوب لمعالجة كل متغير وتضمين المدة في الرسالة.main.rs: أدرِج وحدة traffic، وأنشئ مثيلات لكل متغير من متغيرات الإشارة، واستدعِ أسلوبstatusعلى كل منها لطباعة الأوصاف.
يجب أن يعيد أسلوب status الرسائل بالتنسيقات الدقيقة التالية:
- لـ
Red:Stop for {seconds} seconds - لـ
Yellow:Caution for {seconds} seconds - لـ
Green:Go for {seconds} seconds
يجب أن يعرض الناتج حالة كل إشارة في سطر مستقل:
Stop for {seconds} seconds
Caution for {seconds} seconds
Go for {seconds} secondsعلى سبيل المثال، إذا استمرت الإشارة الحمراء 30 ثانية، والصفراء 5 ثوانٍ، والخضراء 25 ثانية، فسيكون الناتج:
Stop for 30 seconds
Caution for 5 seconds
Go for 25 secondsستتلقى ثلاث مدخلات: مدة الإشارة الحمراء، ومدة الإشارة الصفراء، ومدة الإشارة الخضراء.
جرّب بنفسك
mod traffic;
use traffic::TrafficLight;
fn main() {
// اقرأ المدخلات للمدد
let mut red_input = String::new();
std::io::stdin().read_line(&mut red_input).expect("Failed to read line");
let red_duration: u32 = red_input.trim().parse().expect("Invalid number");
let mut yellow_input = String::new();
std::io::stdin().read_line(&mut yellow_input).expect("Failed to read line");
let yellow_duration: u32 = yellow_input.trim().parse().expect("Invalid number");
let mut green_input = String::new();
std::io::stdin().read_line(&mut green_input).expect("Failed to read line");
let green_duration: u32 = green_input.trim().parse().expect("Invalid number");
// TODO: أنشئ مثيلات لكل متغير من TrafficLight بالمدد المدخلة
// TODO: استدعِ الدالة status على كل ضوء واطبع النتيجة
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت