Menu
Coddy logo textTech

חזרה על ה-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 עוטף את הרעיון של „אולי יש ערך” ומספק ממשק נקי לעבודה איתו. קוראים לשיטות של האובייקט במקום לכתוב לוגיקה חיצונית כדי לבדוק אותו.

challenge icon

אתגר

קל

בואו נבנה מערכת פרופילי משתמשים שמטפלת בחן בנתונים אופציונליים באמצעות מתודות של 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: [Your translated content here]

נסו בעצמכם

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 של הפרופיל השני
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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

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