דילוג לתוכן המרכזי
מודול 5 · שיעור 2 מתוך 210/14 בקורס~15 min
שיעורי מודול (2/2)

תכונות וגבולות תכונה

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

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


הגדרה ויישום של תכונה

כדי להגדיר תכונה, אנו משתמשים במילת המפתח trait ואחריה בחתימות השיטות שהטמעת טיפוסים חייבת להגדיר:

Rust
pub trait Summary {
    fn summarize(&self) -> String;
}

כדי ליישם תכונה על סוג קונקרטי, אנו משתמשים בתחביר impl TraitName for TypeName:

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}", self.headline)
    }
}

גבולות תכונה

בעת כתיבת פונקציות כלליות, אנו יכולים להגביל את פרמטרי הסוג כדי להבטיח שהם מיישמים תכונה ספציפית. התחביר הסטנדרטי הוא <T: Trait>:

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

לחלופין, עבור חתימות מורכבות יותר, אנו יכולים להשתמש בסעיף where:

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

נסה זאת בעצמך

תרגיל 1: תכונת הסיכום

פעילות גופנית#rust.m5.l2.e1
ניסיונות: 0טוען...

הגדר תכונה בשם Summary המכילה את חתימת השיטה fn summarize(&self) -> String;. לאחר מכן, הגדירו מבנה NewsArticle עם שדה כותרת מסוג String והטמיעו עבורו את תכונת ה-Susum, כך ששיטת הסיכום תחזיר את הערך של שדה הכותרת.

טוען עורך...
הצג רמז

הגדר את תכונת `סיכום`ומבנה`מאמר חדשות`. יישם עם `impl Summary for NewsArticle`שבבוט השדה`self.headline.clone()`.

הפתרון זמין לאחר 3 ניסיונות

תרגיל 2: גבולות תכונה עם print_summary

פעילות גופנית#rust.m5.l2.e2
ניסיונות: 0טוען...

בהתבסס על הקוד מהתרגיל הקודם, הגדר פונקציה גנרית בשם print_summary<T> שמקבלת פריט פרמטר מסוג &T. החל תכונה קשורה כך ש-T חייב ליישם את תכונת הסיכום. בתוך הפונקציה, הדפס את התוצאה שהוחזרה על ידי item.summarize().

טוען עורך...
הצג רמז

השתמש בחתימה `fn print_summary<T: Summary>(item: &T)`והפעיל`item.summarize()`בתוך`println!`.

הפתרון זמין לאחר 3 ניסיונות

תרגיל 3: חישוב שטח באמצעות תכונות

פעילות גופנית#rust.m5.l2.e3
ניסיונות: 0טוען...

הגדר תכונה בשם Area עם השיטה fn area(&self) -> f64;. צור עיגול struct המכיל שדה רדיוס מסוג f64, והטמיע עבורו את תכונת ה-Area על ידי חישוב השטח (נוסחה: רדיוס * רדיוס * 3.14159).

טוען עורך...
הצג רמז

הגדר את תכונת ה"שטח" ומבנה ה"מעגל". יישם `שטח(&עצמי)` באמצעות נוסחת שטח המעגל.

הפתרון זמין לאחר 3 ניסיונות