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

כללי ופונקציות

גנריות מאפשרות לך לכתוב קוד גמיש וניתן לשימוש חוזר, תוך הימנעות שכפול של לוגיקה עבור סוגי נתונים שונים. במקום להגדיר מספר פונקציות או מבנים עבור סוגים שונים (כמו i32, f64, או String), אנו יכולים להשתמש בפרמטר סוג גנרי, המיוצג באופן קונבנציונלי באות T.

מהדר Rust מנהל גנריות באמצעות תהליך הנקרא מונומורפיזציה: במהלך ההידור, הוא יוצר עותק של הקוד הגנרי עבור כל סוג בטון שבו נעשה שימוש בפועל. המשמעות היא שיש אפס ביצועי זמן ריצה.


פונקציות כלליות

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

Rust
fn print_value<T: std::fmt::Debug>(value: T) {
    println!("Value: {:?}", value);
}

בפונקציות גנריות, אנו יכולים להשתמש בסוג הגנרי T הן עבור סוגי ארגומנטים והן עבור סוגי החזרה:

Rust
fn identity<T>(value: T) -> T {
    value
}

מבנים גנריים

אנו יכולים גם להשתמש בפרמטרי סוג גנריים בתוך מבנים (struct) כדי להגדיר שדות גמישים:

Rust
struct KeyValuePair<K, V> {
    key: K,
    value: V,
}

fn main() {
    let pair = KeyValuePair {
        key: String::from("age"),
        value: 30,
    };
}

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

Rust
struct Container<T> {
    value: T,
}

impl<T> Container<T> {
    fn new(value: T) -> Self {
        Container { value }
    }

    fn value(&self) -> &T {
        &self.value
    }
}

נסה זאת בעצמך

תרגיל 1: מבנה הנקודות

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

הגדר מבנה גנרי בשם Point<T> עם שני שדות: x מסוג T ו-y מסוג T. בפונקציה הראשית, הצג נקודה משתנה המכילה Point עם ערכי מספר שלמים x = 5 ו-y = 10, ולאחר מכן הדפס את הערך של point.x.

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

הכריז על המבנה באמצעות `struct Point<T> { x: T, y: T }`. הפעל אותו ב-main והשתמש ב-'point.x' כדי להדפיס אותו.

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

תרגיל 2: היפוך טופל עם החלפה

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

כתוב פונקציה גנרית בשם swap<T> שמקבלת טופלה של שני אלמנטים (T,T) ומחזירה טופלה חדשה (T,T) כשהמיקומים שלהם הפוכים. בפונקציה הראשית, קרא לפונקציה עם tuple (1, 2) והדפיס את התוצאה.

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

חתימת הפונקציה חייבת להיות `fn swap<T>(זוג: (T,T)) -> (T,T)`. החזר את הטפול ההפוך עם `(זוג.1, זוג.0)`.

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

תרגיל 3: מבנה המכולה

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

הגדר מבנה גנרי Container<T> המכיל שדה ערך מסוג T. יישם בלוק impl גנרי כדי להגדיר שיטה חדשה המקבלת ערך מסוג T ומחזירה מופע של Container<T>.

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

השתמש ב-`impl<T> Container<T>`כדי ליישם את השיטה המשויכת`fn new(value: T) -> Self { Container { value } }`.

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