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

שיטות ו-impl Blocks

ב-Rust, מתודות דומות לפונקציות, אך הן מוגדרות בהקשר של מבנה (או enum או תכונה), והפרמטר הראשון שלהן הוא תמיד self, המייצג את המופע של המבנה שעליו נקראת השיטה.

הגדרת שיטות עם impl

כדי להגדיר שיטות על מבנה, אנו משתמשים בבלוק impl (יישום) עם שם המבנה:

Rust
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    // This is an instance method. It takes &self for reading.
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect = Rectangle { width: 30, height: 50 };

    // Call the method using dot notation
    println!("The area is: {}", rect.area());
}

פונקציות משויכות (סטטיות).

פונקציות המוגדרות בתוך בלוק impl שלא מקבלות את self כפרמטר הראשון שלהן נקראות פונקציות משויכות (מקבילות לשיטות סטטיות בשפות אחרות).

הם משמשים לעתים קרובות בתור בנאים כדי להחזיר מופעים חדשים של המבנה. כדי לקרוא להם, השתמש בתחביר נקודתיים כפול :::

Rust
impl Rectangle {
    // Associated function
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

fn main() {
    // Call the associated function
    let sq = Rectangle::square(10);
}

שיטות שמשנות מצב: &mut self

אם שיטה צריכה לשנות את השדות של המבנה, עליה להכריז על הפרמטר הראשון שלה בתור &mut self. יש להכריז על המופע עצמו שבו נקראת השיטה כניתנת לשינוי (let mut):

Rust
impl Rectangle {
    fn double_size(&mut self) {
        self.width *= 2;
        self.height *= 2;
    }
}

נסה זאת בעצמך

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

השלם את בלוק impl על ידי הגדרת שיטת השטח שלוקחת &self ומחזירה u32 (הכפל של רוחב וגובה).

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

כתוב `fn area(&self) -> u32 { self.width \* self.height }`בתוך הבלוק `impl Rectangle`.

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

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

הגדר את הפונקציה המשויכת לריבוע בתוך impl Rectangle, שמקבלת גודל: u32 ומחזירה מופע Rectangle עם רוחב וגובה שווים לגודל.

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

כתוב `fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`בתוך הבלוק`impl`.

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

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

הוסף את שיטת המוטטור בקנה מידה ל-Retangle בתוך בלוק impl. שיטת הסולם חייבת לקחת התייחסות ניתנת לשינוי לעצמי (&mut self) ופקטור: פרמטר u32, ולהכפיל גם את הרוחב וגם את הגובה של מלבן בפקטור.

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

יישם `fn scale(&mut self, factor: u32)`כדי לעדכן`self.width`and`self.height`על ידי הכפלתם ב`פקטור`.

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