Menu
Coddy logo textTech

דריסת ברירות מחדל

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

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

פשוט הגדירו את המתודה עם אותה חתימה, אך כללו את הלוגיקה המותאמת אישית שלכם:

trait Greet {
    fn greet(&self) -> String {
        String::from("Hello there!")
    }
}

struct Robot {
    id: u32,
}

impl Greet for Robot {
    fn greet(&self) -> String {
        format!("BEEP BOOP. Unit {} online.", self.id)
    }
}

למרות ש-Greet מספקת שיטת ברירת מחדל בשם greet, Robot מחליפה אותה לחלוטין בגרסה משלה. כשקוראים ל-greet() על Robot, Rust משתמשת במימוש המותאם אישית:

let bot = Robot { id: 42 };
println!("{}", bot.greet());  // ביפ בופ. יחידה 42 מחוברת.

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

challenge icon

אתגר

קל

בואו נבנה מערכת התראות שבה סוגים שונים של התראות יכולים להתאים אישית את ההודעות שלהם! תיצרו trait עם מימוש ברירת מחדל, ואז תגרמו לסוג אחד להשתמש בברירת המחדל ולסוג אחר לדרוס אותה בהתנהגות מותאמת אישית.

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

  • notifiable.rs: הגדירו trait ציבורי בשם Notifiable עם מתודה notify(&self) -> String שיש לה מימוש ברירת מחדל שמחזיר "Alert: Something happened!".
  • alerts.rs: צרו שתי struct-ים ציבוריים שמממשים את ה-trait שלכם בדרכים שונות:
    • GenericAlert: struct יחידתית שמשתמשת בהתראת ברירת המחדל (בלוק impl ריק)
    • UrgentAlert: struct עם שדה message ציבורי (String), שדורס את ברירת המחדל ומחזיר "URGENT: {message}", כאשר {message} היא ההודעה השמורה בו
  • main.rs: חברו את המודולים שלכם והדגימו את שתי ההתנהגויות. צרו GenericAlert ו-UrgentAlert באמצעות הקלט שסופק, ואז הדפיסו את ההתראות שלהם.

התובנה המרכזית כאן היא ש-GenericAlert מקבל התנהגות מוכנה בזכות ברירת המחדל, ואילו UrgentAlert מספק גרסה ייעודית משלו באמצעות הגדרת המתודה בבלוק ה-impl שלו.

הפלט שלכם צריך להיות בפורמט הבא:

Alert: Something happened!
URGENT: {message}

לדוגמה, עבור הקלט Server is down!:

Alert: Something happened!
URGENT: Server is down!

תקבלו קלט אחד: ההודעה עבור ההתראה הדחופה.

נסו בעצמכם

mod notifiable;
mod alerts;

use alerts::{GenericAlert, UrgentAlert};
use notifiable::Notifiable;

fn main() {
    // קרא קלט עבור הודעת ההתראה הדחופה
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let message = input.trim().to_string();

    // TODO: צור מופע של GenericAlert

    // TODO: צור מופע של UrgentAlert עם הודעת הקלט

    // TODO: הדפס את ההודעה מ-GenericAlert

    // TODO: הדפס את ההודעה מ-UrgentAlert
}
quiz iconבחנו את עצמכם

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

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

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