Menu
Coddy logo textTech

סיכום - מדפיס גנרי

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

challenge icon

אתגר

קל

בואו נבנה מערכת הכרזות גמישה שמדגימה את העוצמה של חסמי תכונות! תיצרו תכונת Printable ופונקציה גנרית שתוכל להכריז על כל סוג שמממש את התכונה הזאת: כך תראו כיצד גנריות ותכונות פועלות יחד כדי ליצור קוד רב־פעמי ובטוח מבחינת טיפוסים.

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

  • printable.rs: הגדירו תכונת Printable ציבורית עם מתודה print_info שמקבלת &self ומחזירה String. לאחר מכן, צרו פונקציה גנרית ציבורית בשם announce שמקבלת כל סוג T שמממש את Printable. הפונקציה צריכה להדפיס Announcement: {info}, כאשר {info} הוא הערך שמוחזר מקריאה ל-print_info() עבור הפריט.
  • main.rs: צרו שתי רשומות ציבוריות שמממשות את Printable:
    • Person: עם שדה ציבורי name (String). המתודה print_info שלה צריכה להחזיר Person: {name}
    • Product: עם שדות ציבוריים name (String) ו-price (f64). המתודה print_info שלה צריכה להחזיר Product: {name} - ${price}
    הוסיפו את מודול ההדפסה שלכם, השתמשו בקלטים כדי ליצור Person ו-Product, ואז קראו ל-announce עם כל אחד מהם כדי להדגים שהפונקציה הגנרית שלכם עובדת עם כל סוג של Printable.

היופי בתכנון הזה הוא של-announce לא משנה אם היא מקבלת Person, Product או כל סוג עתידי. היא רק דורשת שהסוג יוכל לספק מידע באמצעות print_info(). חסם התכונה מבטיח זאת בזמן הקומפילציה.

הפלט שלכם צריך להציג את שתי ההכרזות:

Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}

לדוגמה, עבור הקלטים Alice, Laptop ו-999.99:

Announcement: Person: Alice
Announcement: Product: Laptop - $999.99

תקבלו שלושה קלטים: שם האדם, שם המוצר ומחיר המוצר (יש לנתח אותו כ-f64).

נסו בעצמכם

mod printable;

use printable::{Printable, announce};

// TODO: הגדירו struct ציבורי בשם Person עם שדה ציבורי בשם name (String)
// ממשו את ה-trait Printable עבור Person
// הפונקציה print_info צריכה להחזיר "Person: {name}"

// TODO: הגדירו struct ציבורי בשם Product עם שדות ציבוריים בשם name (String) ו-price (f64)
// ממשו את ה-trait Printable עבור Product
// הפונקציה print_info צריכה להחזיר "Product: {name} - ${price}"

fn main() {
    // קראו את נתוני הקלט
    let mut person_name = String::new();
    std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
    let person_name = person_name.trim().to_string();

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

    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");

    // TODO: צרו מופע של Person עם person_name

    // TODO: צרו מופע של Product עם product_name ו-price

    // TODO: קראו ל-announce עם Person

    // TODO: קראו ל-announce עם Product
}

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

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