מימוש 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: טיפוסים שונים, ממשק זהה, התנהגויות ייחודיות.
אתגר
קלבואו ניתן לתכונות חיים באמצעות מימוש שלהן עבור טיפוסים שונים! תיצרו תכונת Describable ותממשו אותה עבור שתי מחלקות struct שונות, שכל אחת מהן מספקת תיאור ייחודי משלה.
תארגנו את הקוד שלכם בשלושה קבצים:
describable.rs: הגדירו תכונתDescribableציבורית עם מתודהdescribe(&self) -> String.items.rs: צרו שתי מחלקות struct ציבוריות שמממשות את התכונה שלכם:Bookעם שדה ציבוריtitle(String)Movieעם שדה ציבוריname(String)
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: הדפיסו את התיאור של הסרט
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין