סיכום - מדפיס גנרי
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 44 מתוך 61.
אתגר
קלבואו נבנה מערכת הכרזות גמישה שמדגימה את העוצמה של חסמי תכונות! תיצרו תכונת 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}
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
}
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמד8תכונות כאילוצים
תחביר של אילוצי תכונותאילוצים מרוביםסעיף whereהחזרת טיפוסים עם תכונותסיכום - מדפיס גנריתרגלו בעצמכם: קומפיילר Rust אונליין