Menu
Coddy logo textTech

חילוץ ערך מתוך 'Option'

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

לפעמים צריך לחלץ את הערך בפועל מתוך Option כשאתם בטוחים שהוא מכיל Some. Rust מספקת את המתודה .unwrap() למטרה זו - היא מוציאה את הערך מתוך Some ומחזירה אותו ישירות.

let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);

כשקוראים ל־.unwrap() על Some(value), מתקבל הערך הפנימי. בדוגמה שלמעלה, actual_number הופך ל־42 — הוא כבר לא עטוף ב־Option.

עם זאת, יש אזהרה חשובה: אם תקרא ל־.unwrap() על None, התוכנית שלך תיכנס למצב panic ותקרוס מיד. לכן .unwrap() היא שיטה שעלולה להיות מסוכנת, ויש להשתמש בה רק כשאתה בטוח לחלוטין שה־Option מכיל Some.

let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // זה יגרום ל-panic!

השתמשו ב־.unwrap() במשורה ורק במצבים שבהם אפשר להבטיח שה־Option מכיל ערך, כמו בדוגמאות פשוטות או לאחר שכבר בדקתם באמצעות .is_some().

challenge icon

אתגר

קל

תקבלו שתי קלטים. הקלט הראשון הוא מספר (כמחרוזת), והקלט השני מציין אם יש להתייחס למספר הזה כתקף או כלא תקף. אם הקלט השני הוא valid, צרו Option<i32> שמכיל Some עם המספר שפוענח. אם הקלט השני הוא invalid, צרו Option<i32> שמכיל None. השתמשו ב־.unwrap() כדי לחלץ את הערך מתוך Option ולהדפיס אותו.

דרישות:

  • קראו את הקלט הראשון והסירו ממנו רווחים לבנים
  • קראו את הקלט השני והסירו ממנו רווחים לבנים
  • פענחו את הקלט הראשון ל־i32 באמצעות .parse::<i32>()
  • צרו משתנה מסוג Option<i32>:
    • אם הקלט השני הוא valid, הקצו לו Some(parsed_number)
    • אם הקלט השני הוא invalid, הקצו לו None
  • השתמשו ב־.unwrap() כדי לחלץ את הערך מתוך Option
  • הדפיסו את הערך שחולץ בפורמט: Value: [number]

קלט:

  • שורה ראשונה: מספר כמחרוזת (למשל, 42)
  • שורה שנייה: valid או invalid

פלט:

  • אם הקלט השני הוא valid: Value: [number]
  • אם הקלט השני הוא invalid: התוכנית תיכנס למצב panic (זו ההתנהגות הצפויה באתגר הזה)

הערה: כאשר הקלט השני הוא invalid, קריאה ל־.unwrap() על None תגרום ל־panic. הדבר מדגים את הסכנה שבשימוש ב־.unwrap() כשאינכם בטוחים שה־Option מכיל ערך.

נסו בעצמכם

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();
    
    // קראו את הקלט השני (תקין או לא תקין)
    let mut validity_input = String::new();
    io::stdin().read_line(&mut validity_input).expect("Failed to read line");
    let validity_input = validity_input.trim();
    
    // המירו את המספר
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // TODO: כתבו את הקוד שלכם למטה
    // צרו Option<i32> על סמך validity_input
    // אם validity_input הוא "valid", הקצו Some(parsed_number)
    // אם validity_input הוא "invalid", הקצו None
    // לאחר מכן השתמשו ב-.unwrap() כדי לחלץ את הערך ולהדפיס אותו בפורמט: Value: [number]
    
}
quiz iconבחנו את עצמכם

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

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

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