מהו Trait?
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 29 מתוך 61.
טיפוסים גנריים מאפשרים לך לכתוב קוד שעובד עם כל טיפוס, אבל לפעמים צריך להבטיח שטיפוס יוכל לעשות משהו מסוים. כאן נכנסות לתמונה תכונות.
תכונה מגדירה קבוצה של מתודות שסוג חייב לממש. חשבו עליה כחוזה: כל סוג ש״חותם״ על החוזה הזה מתחייב לספק את ההתנהגות שצוינה. אם השתמשתם בממשקים בשפות אחרות, תכונות ממלאות תפקיד דומה.
כך מגדירים תכונה:
trait Describable {
fn describe(&self) -> String;
}
מילת המפתח trait מציגה את ה־trait, ואחריה מופיע שמו. בתוך הסוגריים המסולסלים מצהירים על חתימות של מתודות: רק השם, הפרמטרים וסוג הערך המוחזר, ללא גוף. הנקודה־פסיק שאחרי החתימה מציינת שזו דרישה ולא מימוש.
תכונת Describable הזו אומרת: "כל טיפוס שמממש אותי חייב לספק מתודת describe שמקבלת הפניה לעצמו ומחזירה String." לתכונה לא משנה איך המתודה פועלת: הדבר נתון לבחירתו של כל טיפוס שמממש אותה.
תכונות נעשות עוצמתיות כאשר כמה סוגים שונים מממשים את אותה תכונה. Book, Car ו-Person יכולים כולם להיות Describable, וכל אחד מהם מספק תיאור ייחודי משלו. התכונה מבטיחה שלכולם תהיה היכולת המשותפת הזו.
אתגר
קלבואו נגדיר את ה-trait הראשון שלך! Trait מגדיר חוזה: הבטחה שכל טיפוס שמממש אותו יספק התנהגות מסוימת. תיצור trait בשם Summarizable שסוגים שונים יכולים לממש כדי לספק סיכום של עצמם.
תארגן את הקוד שלך בשני קבצים:
summary.rs: הגדר trait ציבורי בשםSummarizableעם חתימת מתודה אחת:summarize(&self) -> String. זכור, בהגדרת trait מצהירים רק על חתימת המתודה ומסיימים אותה בנקודה-פסיק: ללא גוף. כך אומרים ל-Rust "כל טיפוס שמממש את ה-trait הזה חייב לספק מתודתsummarizeשמחזירהString."main.rs: טען את מודול הסיכום שלך והדפס הודעה המאשרת שה-trait שלך הוגדר. מכיוון שעדיין לא למדנו כיצד לממש traits (זה השיעור הבא!), פשוט תוודא שה-trait שלך מתקמפל כראוי.
בקובץ הראשי שלך, הדפס את ההודעה הבאה כדי לאשר שהגדרת ה-trait שלך תקינה:
Summarizable trait defined successfully!האתגר הזה מתמקד אך ורק בתחביר של הגדרת trait: מילת המפתח trait, שם ה-trait והצהרה על חתימות של מתודות ללא מימושים. בשיעור הבא תלמד כיצד לגרום למבנים לממש את ה-trait הזה!
נסו בעצמכם
mod summary;
fn main() {
// TODO: הדפס את הודעת האישור שה-trait מוגדר
// פלט צפוי: "Summarizable trait defined successfully!"
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין