המתודה expect
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 39 מתוך 66.
אף ש־.unwrap() עושה את העבודה, יש לו חיסרון משמעותי: כשהוא נכנס לפאניקה על None, הודעת השגיאה כללית ולא מועילה. כאן .expect() בא לעזרה.
השיטה .expect() פועלת בדיוק כמו .unwrap() — היא מחלצת את הערך מתוך Some ונכנסת לפאניקה במקרה של None. ההבדל העיקרי הוא ש-.expect() מאפשרת לך לספק הודעת פאניקה מותאמת אישית:
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);אם ה־Option מכיל Some, .expect() מחזירה את הערך הפנימי בדיוק כמו .unwrap(). אבל אם הוא None, במקום הודעת panic כללית, תופיע ההודעה המותאמת אישית שלך, וכך יהיה הרבה יותר קל להבין מה השתבש והיכן.
אתגר
קלתקבלו שתי קלטים. הקלט הראשון הוא שם של מוצר, והקלט השני מציין אם המוצר נמצא במלאי (yes) או אזל מהמלאי (no). צרו Option<String> שמכיל Some(product_name) אם המוצר נמצא במלאי, או None אם הוא אזל מהמלאי. השתמשו ב-.expect() עם הודעה תיאורית כדי לחלץ את שם המוצר ולהדפיס אותו.
דרישות:
- קראו את הקלט הראשון (שם המוצר) והסירו רווחים לבנים
- קראו את הקלט השני (מצב המלאי) והסירו רווחים לבנים
- צרו משתנה מסוג
Option<String>:- אם מצב המלאי הוא
yes, הקצו לוSome(product_name.to_string()) - אם מצב המלאי הוא
no, הקצו לוNone
- אם מצב המלאי הוא
- השתמשו ב-
.expect()עם ההודעה"Product should be in stock"כדי לחלץ את שם המוצר - הדפיסו את שם המוצר שחולץ בפורמט:
Product available: [product_name]
קלט:
- השורה הראשונה: שם של מוצר (לדוגמה,
Laptop) - השורה השנייה:
yesאוno
פלט:
- אם מצב המלאי הוא
yes:Product available: [product_name] - אם מצב המלאי הוא
no: התוכנית תיכנס למצב panic עם ההודעה המותאמת אישית "Product should be in stock" (זו ההתנהגות הצפויה באתגר הזה)
הערה: כאשר מצב המלאי הוא no, קריאה ל-.expect() על None תגרום ל-panic עם ההודעה המותאמת אישית שלכם. כך מודגם כיצד .expect() מספק מידע מועיל יותר על השגיאה בהשוואה ל-.unwrap().
נסו בעצמכם
use std::io;
fn main() {
// קרא את שם המוצר
let mut product_name = String::new();
io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim();
// קרא את מצב המלאי
let mut stock_status = String::new();
io::stdin().read_line(&mut stock_status).expect("Failed to read line");
let stock_status = stock_status.trim();
// TODO: כתוב את הקוד שלך למטה
// צור Option<String> על סמך stock_status
// השתמש ב-.expect() כדי לחלץ את שם המוצר
// הדפס את התוצאה בפורמט: Product available: [product_name]
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
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 אונליין