דריסת ברירות מחדל
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 עדיין מבטיח שהמתודה תהיה זמינה בכל טיפוס שמממש אותו.
אתגר
קלבואו נבנה מערכת התראות שבה סוגים שונים של התראות יכולים להתאים אישית את ההודעות שלהם! תיצרו 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
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמד3Enums מתקדמים
Enums עם נתוניםמתודות ב-Enumsהתאמה של וריאנטים עם נתוניםחזרה על ה-Option Enumסיכום - ה-Shape Enum6הגדרת Traits
מהו Trait?מימוש Traitsמימושי ברירת מחדלדריסת ברירות מחדלTraits עם פרמטריםחזרה — נגן מדיהתרגלו בעצמכם: קומפיילר Rust אונליין