חזרה על ה-Option Enum
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 17 מתוך 61.
כבר נתקלת ב־Option<T> ב־Rust: זהו enum סטנדרטי לייצוג ערכים שעשויים להתקיים או לא להתקיים. עכשיו נבחן אותו מנקודת מבט של תכנות מונחה עצמים: Option הוא לא רק enum, אלא טיפוס עם מתודות מובנות ועוצמתיות שמאפשרות לך לטפל בערכים שיכולים להיות null בבטחה ובאלגנטיות.
במקום לבצע התאמה בכל פעם, אפשר להשתמש בשיטות ישירות על ערכי Option. השיטה unwrap_or מחזירה את הערך הפנימי אם הוא קיים, או ערך ברירת מחדל שמספקים:
let maybe_name: Option<String> = Some(String::from("Alice"));
let name = maybe_name.unwrap_or(String::from("Guest"));
println!("{}", name); // Alice
let empty: Option<String> = None;
let fallback = empty.unwrap_or(String::from("Guest"));
println!("{}", fallback); // Guest
המתודה map משנה את הערך הפנימי אם הוא קיים, ומשאירה את None ללא שינוי. כך אפשר לשרשר פעולות בלי לבדוק כל הזמן אם הערך הוא None:
let maybe_num: Option<i32> = Some(5);
let doubled = maybe_num.map(|x| x * 2);
println!("{:?}", doubled); // Some(10)
let nothing: Option<i32> = None;
let still_nothing = nothing.map(|x| x * 2);
println!("{:?}", still_nothing); // None
השיטות האלה מגלמות עקרונות של OOP: הטיפוס Option עוטף את הרעיון של „אולי יש ערך” ומספק ממשק נקי לעבודה איתו. קוראים לשיטות של האובייקט במקום לכתוב לוגיקה חיצונית כדי לבדוק אותו.
אתגר
קלבואו נבנה מערכת פרופילי משתמשים שמטפלת בחן בנתונים אופציונליים באמצעות מתודות של Option. ייתכן שלמשתמשים מוגדר כינוי, וייתכן שלא. המערכת שלכם תטפל בשני המקרים באלגנטיות, ללא התאמה מפורשת.
תיצרו שני קבצים כדי לארגן את הקוד שלכם:
profile.rs: הגדירו מבנהProfileציבורי עם שני שדות:username(String) ו-nickname(Option<String>). ממשו:- בנאי
newשמקבל שם משתמש וכינוי אופציונלי - מתודת
display_nameשמחזירה את הכינוי אם הוא קיים, או את שם המשתמש כערך חלופי: השתמשו ב-unwrap_orכדי לטפל בכך - מתודת
formatted_nicknameשמחזירהOption<String>ובו הכינוי עטוף בסוגריים מרובעים (כמו"[CoolNick]") אם הוא קיים, אוNoneאם אין כינוי: השתמשו ב-mapכדי לשנות את הערך
- בנאי
main.rs: כללו את מודול הפרופיל שלכם וצרו שני פרופילים: אחד עם כינוי ואחד בלי. הדגימו את שתי המתודות בכל פרופיל כדי להראות כיצד מתודות שלOptionמטפלות באופן שונה בערכים קיימים וחסרים.
במתודת formatted_nickname, השתמשו בעיצוב לניפוי שגיאות ({:?}) בעת ההדפסה, מכיוון שהיא מחזירה Option.
הפלט שלכם צריך להיות בדיוק בפורמט הזה ולהציג את שני הפרופילים:
Display name: {name}
Formatted nickname: {option}
Display name: {name}
Formatted nickname: {option}לדוגמה, עבור פרופיל עם שם המשתמש "alice" והכינוי "Ace", ועבור פרופיל נוסף עם שם המשתמש "bob" ללא כינוי, הפלט יהיה:
Display name: Ace
Formatted nickname: Some("[Ace]")
Display name: bob
Formatted nickname: Noneתקבלו שלוש קלטים: שם המשתמש הראשון, הכינוי של המשתמש הראשון ושם המשתמש השני (שאין לו כינוי).
REQUIRED OUTPUT FORMAT:נסו בעצמכם
mod profile;
use profile::Profile;
fn main() {
// קראו את הקלטים
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let username1 = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let nickname1 = input2.trim().to_string();
let mut input3 = String::new();
std::io::stdin().read_line(&mut input3).expect("Failed to read line");
let username2 = input3.trim().to_string();
// TODO: צרו את הפרופיל הראשון עם username1 ו-nickname1 (Some)
// TODO: צרו את הפרופיל השני עם username2 וללא כינוי (None)
// TODO: הדפיסו את display_name ואת formatted_nickname של הפרופיל הראשון
// השתמשו ב-{:?} עבור formatted_nickname, מכיוון שהוא מחזיר Option
// TODO: הדפיסו את display_name ואת formatted_nickname של הפרופיל השני
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמד3Enums מתקדמים
Enums עם נתוניםמתודות ב-Enumsהתאמה של וריאנטים עם נתוניםחזרה על ה-Option Enumסיכום - ה-Shape Enumתרגלו בעצמכם: קומפיילר Rust אונליין