Enums עם נתונים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 14 מתוך 61.
מאפשרים לך להגדיר ב-Rust סוג עם קבוצה קבועה של וריאנטים, כמו Direction::North או Status::Active. אבל אנומים ב-Rust חזקים הרבה יותר מזה. כל וריאנט יכול להכיל נתונים משלו, מה שהופך אנומים לגמישים להפליא לצורך מידול של תרחישים מהעולם האמיתי.
נניח שיש מערכת הודעות שבה סוגים שונים של הודעות נושאים מידע שונה. להודעת טקסט יש תוכן, לפקודת תנועה יש קואורדינטות ולאות יציאה אין כלל מידע. ב-Rust אפשר לייצג את כל אלה באמצעות enum יחיד:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(u8, u8, u8),
}
לכל וריאנט יש צורה אחרת. Quit לא מכיל נתונים: זהו רק אות.
Move משתמש בתחביר דמוי מבנה עם שדות בעלי שמות. Write מכיל String יחיד באמצעות תחביר של tuple. ChangeColor מכיל שלושה ערכים שמייצגים רכיבי RGB.
יצירת מופעים של הווריאנטים האלה נראית כך:
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
let m3 = Message::Write(String::from("Hello"));
let m4 = Message::ChangeColor(255, 128, 0);
היופי בגישה הזו הוא ש-m1, m2, m3 ו-m4 הם כולם מאותו סוג: Message. אפשר לאחסן אותם באותו אוסף, להעביר אותם לאותה פונקציה או להחזיר כל וריאנט מפונקציה אחת. ה-enum מאחד צורות נתונים שונות תחת סוג אחד, תוך שמירה על המידע הספציפי שכל וריאנט צריך.
אתגר
קלבואו נבנה מערכת התראות שמשתמשת במנויים עם נתונים כדי לייצג סוגים שונים של התראות. כל סוג של התראה נושא מידע שונה: לחלקן יש הודעות, לחלקן יש ערכים מספריים, וחלקן הן אותות פשוטים.
תיצרו שני קבצים כדי לארגן את הקוד:
notification.rs: הגדירו מנוי ציבורי בשםNotificationעם שלוש וריאציות:Alert: מכילה הודעתStringיחידה (תחביר של tuple)Reminder: מכילה שדות בעלי שמות:title(String) ו-minutes(u32)Dismiss: אינה מכילה נתונים, אלא רק אות
main.rs: יבאו את מודול ההתראות וצרו מופע אחד מכל וריאציה. לאחר מכן הדפיסו מידע על כל התראה כדי להדגים שכל שלוש הווריאציות הן מאותו סוג, אך נושאות נתונים שונים.
בעת ההדפסה, השתמשו בפורמט ניפוי שגיאות ({:?}) כדי להציג כל התראה. תצטרכו לגזור את התכונה Debug עבור המנוי שלכם כדי שיהיה אפשר להדפיס אותו כך.
הפלט שלכם צריך להציג את שלוש ההתראות, כל אחת בשורה משלה:
Alert("{message}")
Reminder { title: "{title}", minutes: {minutes} }
Dismissלדוגמה, עם הודעת התראה "Server down", תזכורת עם הכותרת "Meeting" ו-30 דקות, הפלט יהיה:
Alert("Server down")
Reminder { title: "Meeting", minutes: 30 }
Dismissתקבלו שלוש קלטים: הודעת ההתראה, כותרת התזכורת ומספר הדקות של התזכורת.
נסו בעצמכם
mod notification;
use notification::Notification;
fn main() {
// קרא את הקלטים
let mut alert_message = String::new();
std::io::stdin().read_line(&mut alert_message).expect("Failed to read line");
let alert_message = alert_message.trim().to_string();
let mut reminder_title = String::new();
std::io::stdin().read_line(&mut reminder_title).expect("Failed to read line");
let reminder_title = reminder_title.trim().to_string();
let mut minutes_input = String::new();
std::io::stdin().read_line(&mut minutes_input).expect("Failed to read line");
let reminder_minutes: u32 = minutes_input.trim().parse().expect("Failed to parse minutes");
// TODO: צור התראה מסוג Alert באמצעות alert_message
// TODO: צור התראה מסוג Reminder באמצעות reminder_title ו-reminder_minutes
// TODO: צור התראה מסוג Dismiss
// TODO: הדפס כל התראה באמצעות עיצוב ניפוי שגיאות {:?}
// יש להדפיס כל התראה בשורה נפרדת
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין