שיעורי מודול (2/2)
שיטות ו-impl Blocks
ב-Rust, מתודות דומות לפונקציות, אך הן מוגדרות בהקשר של מבנה (או enum או תכונה), והפרמטר הראשון שלהן הוא תמיד self, המייצג את המופע של המבנה שעליו נקראת השיטה.
הגדרת שיטות עם impl
כדי להגדיר שיטות על מבנה, אנו משתמשים בבלוק impl (יישום) עם שם המבנה:
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 כפרמטר הראשון שלהן נקראות פונקציות משויכות (מקבילות לשיטות סטטיות בשפות אחרות).
הם משמשים לעתים קרובות בתור בנאים כדי להחזיר מופעים חדשים של המבנה. כדי לקרוא להם, השתמש בתחביר נקודתיים כפול :::
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):
impl Rectangle {
fn double_size(&mut self) {
self.width *= 2;
self.height *= 2;
}
}נסה זאת בעצמך
השלם את בלוק impl על ידי הגדרת שיטת השטח שלוקחת &self ומחזירה u32 (הכפל של רוחב וגובה).
הצג רמז
כתוב `fn area(&self) -> u32 { self.width \* self.height }`בתוך הבלוק `impl Rectangle`.
הפתרון זמין לאחר 3 ניסיונות
הגדר את הפונקציה המשויכת לריבוע בתוך impl Rectangle, שמקבלת גודל: u32 ומחזירה מופע Rectangle עם רוחב וגובה שווים לגודל.
הצג רמז
כתוב `fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`בתוך הבלוק`impl`.
הפתרון זמין לאחר 3 ניסיונות
הוסף את שיטת המוטטור בקנה מידה ל-Retangle בתוך בלוק impl. שיטת הסולם חייבת לקחת התייחסות ניתנת לשינוי לעצמי (&mut self) ופקטור: פרמטר u32, ולהכפיל גם את הרוחב וגם את הגובה של מלבן בפקטור.
הצג רמז
יישם `fn scale(&mut self, factor: u32)`כדי לעדכן`self.width`and`self.height`על ידי הכפלתם ב`פקטור`.
הפתרון זמין לאחר 3 ניסיונות