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