Menu
Coddy logo textTech

קיצורי דרך: unwrap ו-expect

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 45 מתוך 66.

כבר למדת על .unwrap() ועל .expect() עם Option, ואותן שיטות פועלות גם עם Result. עם זאת, ההתנהגות שלהן מעט שונה בטיפול במקרי הצלחה וכישלון.

השיטה .unwrap() מחלצת את הערך מתוך וריאנט Ok, אבל אם ה-Result הוא Err, התוכנית שלך תיכנס למצב בהלה ותקרוס. באופן דומה, .expect() עושה את אותו הדבר, אך מאפשרת לך לספק הודעת בהלה מותאמת אישית שמקלה על איתור באגים:

let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // מדפיס: Value: 42

// זה יגרום לפאניקה עם ההודעה המותאמת אישית:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // גורם לפאניקה!

אף ששיטות אלה מספקות גישה מהירה לערכים מוצלחים, יש להשתמש בהן בזהירות. הן מתאימות בעיקר למצבים שבהם בטוחים לחלוטין שהפעולה תצליח, או במהלך פיתוח ובדיקות.

challenge icon

אתגר

קל

תקבלו שתי קלטים. הקלט הראשון הוא מספר (כמחרוזת), והשני הוא מציין מצב (ok או error). צרו Result<i32, &'static str> על סמך המצב. אם המצב הוא ok, צרו Ok שמכיל את המספר שפוענח. אם המצב הוא error, צרו Err עם ההודעה "Invalid operation". השתמשו ב־.expect() עם הודעה מותאמת אישית כדי לחלץ את הערך מתוך Result ולהדפיס אותו.

דרישות:

  • קראו את הקלט הראשון (מספר) והסירו רווחים לבנים מתחילתו ומסופו
  • פענחו את הקלט הראשון ל־i32
  • קראו את הקלט השני (מצב) והסירו רווחים לבנים מתחילתו ומסופו
  • צרו משתנה מסוג Result<i32, &'static str>:
    • אם המצב הוא ok, השימו בו Ok(parsed_number)
    • אם המצב הוא error, השימו בו Err("Invalid operation")
  • השתמשו ב־.expect("Failed to get value") כדי לחלץ את הערך מתוך Result
  • הדפיסו את הערך שחולץ בפורמט: Value: [value]

קלט:

  • שורה ראשונה: מספר (לדוגמה, 75)
  • שורה שנייה: ok או error

פלט:

  • אם המצב הוא ok: Value: [number]
  • אם המצב הוא error: התוכנית תיכנס למצב panic עם ההודעה המותאמת אישית (לא נבדק באתגר הזה)

הערה: באתגר הזה, מקרי הבדיקה ישתמשו רק במצב ok כדי להבטיח ביצוע מוצלח. מקרה ה־error יגרום ל־panic, וזוהי ההתנהגות הצפויה של .expect() כאשר נתקלים ב־Err.

נסו בעצמכם

use std::io;

fn main() {
    // קראו את הקלט הראשון (מספר)
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // המירו את המספר ל-i32
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // קראו את הקלט השני (סטטוס)
    let mut status = String::new();
    io::stdin().read_line(&mut status).expect("Failed to read line");
    let status = status.trim();
    
    // TODO: כתבו את הקוד שלכם למטה
    // צרו Result<i32, &'static str> בהתאם לסטטוס
    // השתמשו ב-.expect() כדי לחלץ את הערך
    // הדפיסו את התוצאה בפורמט: Value: [value]
    
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

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