חילוץ ערך מתוך '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().
אתגר
קלתקבלו שתי קלטים. הקלט הראשון הוא מספר (כמחרוזת), והקלט השני מציין אם יש להתייחס למספר הזה כתקף או כלא תקף. אם הקלט השני הוא 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]
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1זרימת בקרה מתקדמת
ביטוי 'match'התאמה למספר ערכיםהתאמה לטווחיםביטוי 'if let'לולאות כביטוייםסיכום – מנתח פקודות פשוט4קיבוץ נתונים באמצעות מבנים
מהו מבנה?סקירה כללית על מבניםגישה לשדות במבנהמבנים הניתנים לשינוימבנים כפרמטרים של פונקציהמבני טופלסיכום – יצירת מבנה ספר7טיפול בשגיאות באמצעות 'Result'
מהו 'Result'?שימוש ב-'match' עם 'Result'is_ok() ו-is_err()קיצורי דרך: unwrap ו-expectאופרטור סימן השאלה '?'המרת מחרוזות למספריםסיכום - פונקציית חילוק בטוחה10Closures ופונקציות אנונימיות
מהו Closure?הגדרת Closure פשוטClosures עם פרמטריםלכידת הסביבהסיכום – Closure פשוט לחיבור2מבוא לווקטורים
מהו וקטור?יצירת וקטורהוספת איברים באמצעות pushגישה לאיברי וקטורמעבר על וקטורמעבר ניתן לשינויהסרת איבריםסיכום – מעקב בסיסי אחר ניקוד5זוגות מפתח-ערך באמצעות מפות גיבוב
מהי מפת גיבוב?יצירת מפת גיבובהוספת זוגות מפתח-ערךגישה לערכיםמעבר על מפת גיבובעדכון ערךהסרת זוגסיכום – מונה מילים6טיפול בהיעדר באמצעות 'Option'
מהו 'Option'?שימוש ב-'match' עם 'Option'is_some() ו-is_none()חילוץ ערך מתוך 'Option'המתודה expectהגדרת ברירת מחדל: unwrap_orסיכום – מציאת איברתרגלו בעצמכם: קומפיילר Rust אונליין