Menu
Coddy logo textTech

מתודות גנריות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 25 מתוך 61.

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

המפתח הוא להצהיר על הפרמטר הגנרי ב-impl עצמו:

struct Wrapper<T> {
    value: T,
}

impl<T> Wrapper<T> {
    fn get(&self) -> &T {
        &self.value
    }
}

שימו לב ל־impl<T> שלפני Wrapper<T>. כך אומרים ל־Rust ש־T הוא פרמטר טיפוס גנרי עבור בלוק המימוש כולו. ללא ההכרזה הזאת, Rust יחפש טיפוס קונקרטי בשם T ולא ימצא אותו.

השיטה get מחזירה &T: הפניה לכל טיפוס שהעוטף מכיל. זה עובד בין אם T הוא מספר שלם, מחרוזת או כל טיפוס אחר:

let num_wrapper = Wrapper { value: 100 };
let text_wrapper = Wrapper { value: "Rust" };

println!("{}", num_wrapper.get());  // 100
println!("{}", text_wrapper.get()); // Rust

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

challenge icon

אתגר

קל

בואו נרחיב את המכולה הגנרית שלך באמצעות מתודות! תבנה מבנה Box (אין לבלבל בינו לבין Box הסטנדרטי של Rust) שיכול להכיל כל סוג ומספק מתודות לאינטראקציה עם התוכן שלו.

תארגן את הקוד שלך בשני קבצים:

  • mybox.rs: הגדר מבנה גנרי ציבורי בשם MyBox<T> עם שדה פרטי בשם contents מסוג T. ממש את המתודות עבור המבנה הזה:
    • פונקציה משויכת new שיוצרת MyBox חדש עם הערך הנתון
    • מתודת peek שמחזירה הפניה לתוכן (באמצעות &self)
    • מתודת replace שמקבלת ערך חדש ומחליפה את התוכן הנוכחי (באמצעות &mut self)
  • main.rs: הוסף את המודול שלך והדגם את פעולת המתודות הגנריות עם סוגים שונים. תיצור תיבות, תציץ בתוכן שלהן ותחליף ערכים כדי להראות את המתודות בפעולה.

זכור את התחביר החשוב למימוש מתודות על מבנה גנרי: צריך לכתוב impl<T> לפני MyBox<T> כדי לומר ל-Rust ש-T הוא פרמטר גנרי עבור כל בלוק המימוש.

בקובץ הראשי שלך, הדגם את MyBox באמצעות:

  1. יצירת תיבה עם מספר שלם (הקלט הראשון, מפוענח בתור i32)
  2. הצצה בתוכן שלה והדפסת הערך
  3. החלפת התוכן במספר שלם חדש (הקלט השני, מפוענח בתור i32)
  4. הצצה נוספת כדי להציג את הערך המעודכן
  5. יצירת תיבה שנייה עם מחרוזת (הקלט השלישי)
  6. הצצה בתוכן של תיבת המחרוזת

הפלט שלך צריך להיות בפורמט הבא:

Integer box contains: {value}
After replace: {value}
String box contains: {value}

לדוגמה, עם הקלטים 10, 25 ו-Rust:

Integer box contains: 10
After replace: 25
String box contains: Rust

תקבל שלושה קלטים: מספר שלם התחלתי, מספר שלם חלופי וערך מחרוזת.

נסו בעצמכם

mod mybox;

use mybox::MyBox;

fn main() {
    // קראו את הקלטים
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let initial_int: i32 = input1.trim().parse().expect("Invalid integer");

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let replacement_int: i32 = input2.trim().parse().expect("Invalid integer");

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let string_value = input3.trim().to_string();

    // TODO: צרו MyBox עם המספר השלם ההתחלתי
    
    // TODO: הציצו בתכולתו והדפיסו: "Integer box contains: {value}"
    
    // TODO: החליפו את התכולה במספר השלם החלופי
    
    // TODO: הציצו שוב והדפיסו: "After replace: {value}"
    
    // TODO: צרו MyBox נוסף עם ערך המחרוזת
    
    // TODO: הציצו בתיבת המחרוזת והדפיסו: "String box contains: {value}"
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Rust אונליין