Menu
Coddy logo textTech

מימוש Traits

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

עכשיו, אחרי שלמדת להגדיר trait, נראה איך לגרום ל-struct לממש את החוזה הזה. מימוש של trait מחבר בין הדרישה המופשטת להתנהגות מוחשית.

התחביר משתמש ב־impl TraitName for StructName:

trait Speak {
    fn speak(&self) -> String;
}

struct Dog {
    name: String,
}

impl Speak for Dog {
    fn speak(&self) -> String {
        format!("{} says: Woof!", self.name)
    }
}

הבלוק impl Speak for Dog אומר ל-Rust שהטיפוס Dog מממש את ה-trait Speak. בתוכו, מספקים את גוף המתודה בפועל. כאן מגדירים איך כלב מדבר.

העוצמה של מאפיינים מתבהרת כשכמה טיפוסים מממשים את אותו מאפיין:

struct Cat {
    name: String,
}

impl Speak for Cat {
    fn speak(&self) -> String {
        format!("{} says: Meow!", self.name)
    }
}

כעת גם Dog וגם Cat חולקים את היכולת Speak, אך כל אחד מהם מספק מימוש ייחודי משלו. אפשר לקרוא ל־.speak() בכל אחד מהטיפוסים:

let dog = Dog { name: String::from("Rex") };
let cat = Cat { name: String::from("Whiskers") };

println!("{}", dog.speak());  // Rex אומר: הב הב!
println!("{}", cat.speak());  // Whiskers אומר: מיאו!

זהו הבסיס לפולימורפיזם ב-Rust: טיפוסים שונים, ממשק זהה, התנהגויות ייחודיות.

challenge icon

אתגר

קל

בואו ניתן לתכונות חיים באמצעות מימוש שלהן עבור טיפוסים שונים! תיצרו תכונת Describable ותממשו אותה עבור שתי מחלקות struct שונות, שכל אחת מהן מספקת תיאור ייחודי משלה.

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

  • describable.rs: הגדירו תכונת Describable ציבורית עם מתודה describe(&self) -> String.
  • items.rs: צרו שתי מחלקות struct ציבוריות שמממשות את התכונה שלכם:
    • Book עם שדה ציבורי title (String)
    • Movie עם שדה ציבורי name (String)
    כל מחלקת struct צריכה לממש את Describable בפורמט תיאור ייחודי משלה.
  • main.rs: חברו את המודולים שלכם, צרו מופעים של שתי מחלקות ה-struct, וקראו למתודות describe שלהן כדי להראות כיצד אותה תכונה מפיקה פלטים שונים עבור טיפוסים שונים.

ה-Book שלכם צריך לתאר את עצמו בתור Book: {title} וה-Movie שלכם צריך לתאר את עצמו בתור Film: {name}. שימו לב כיצד כל טיפוס מקיים את אותו חוזה, אך עם התנהגות משלו!

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

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

Book: {title}
Film: {name}

לדוגמה, עם הקלטים 1984 ו-Inception:

Book: 1984
Film: Inception

תקבלו שני קלטים: שם של ספר ושם של סרט.

נסו בעצמכם

mod describable;
mod items;

use describable::Describable;
use items::{Book, Movie};

fn main() {
    // קראו את הקלטים
    let mut title = String::new();
    std::io::stdin().read_line(&mut title).expect("Failed to read line");
    let title = title.trim().to_string();
    
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    // TODO: צרו מופע של Book עם הכותרת
    
    // TODO: צרו מופע של Movie עם השם
    
    // TODO: הדפיסו את התיאור של הספר
    
    // TODO: הדפיסו את התיאור של הסרט
}
quiz iconבחנו את עצמכם

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

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

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