Menu
CoddyTech

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

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 אונליין