Menu
Coddy logo textTech

מתודות ב-Enums

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 15 מתוך 61.

בדומה למבנים, אפשר להגדיר מתודות למנויים בתוך בלוקי impl. כך אפשר לשייך התנהגות ישירות לסוג המנוי, ולהקל על העבודה עם וריאנטים שונים באמצעות ממשק אחיד.

כך מוסיפים מתודה למנייה Message מהשיעור הקודם:

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 כדי לקבוע עם איזו וריאנט מתמודדים ולהחזיר את התוצאה המתאימה.

הקריאה למתודה נראית זהה, ללא קשר לאיזו וריאציה יש לך:

fn main() {
    let m1 = Message::Quit;
    let m2 = Message::Move { x: 10, y: 20 };
    
    println!("{}", m1.describe());  // אות Quit
    println!("{}", m2.describe());  // Move אל (10, 20)
}

התבנית הזו עוצמתית כי הקורא לא צריך לדעת איזו וריאציה יש לו. הוא פשוט קורא למתודה, וה־enum מטפל בכל השאר באופן פנימי. ההתנהגות משתנה בהתאם לווריאציה, אבל הממשק נשאר עקבי.

challenge icon

אתגר

קל

נבנה מערכת רמזורים שמשתמשת ב-enum עם מתודות לתיאור מצב האות הנוכחי. כל צבע של רמזור יישא מידע על משך הזמן שבו הוא דולק, ומתודה תספק תיאור קריא לבני אדם.

תיצרו שני קבצים כדי לארגן את הקוד שלכם:

  • traffic.rs: הגדירו enum ציבורי בשם TrafficLight עם שלוש וריאציות:
    • Red: מכילה u32 שמייצג את מספר השניות שיש להמתין
    • Yellow: מכילה u32 שמייצג את מספר השניות שיש להמתין
    • Green: מכילה u32 שמייצג את מספר השניות שבהן אפשר לנסוע
    לאחר מכן, ממשו מתודת status שמחזירה String המתארת את הרמזור. השתמשו ב-match בתוך המתודה כדי לטפל בכל וריאציה ולכלול את משך הזמן בהודעה.
  • main.rs: יבאו את מודול הרמזורים, צרו מופעים של כל וריאציה של רמזור, וקראו למתודת 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 עבור כל רמזור והדפס את התוצאה
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Rust אונליין