שימוש ב-'match' עם 'Result'
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 43 מתוך 66.
עכשיו, לאחר שהבנת מהו Result, נלמד את הדרך המפורשת והעוצמתית ביותר לטפל גם במקרים של הצלחה וגם במקרים של כישלון: שימוש בביטוי match.
בדומה ל־Option, match מחייבת אותך לטפל בשתי הגרסאות של Result. יוצרים זרוע אחת עבור Ok כדי לטפל בהצלחה, וזרוע נוספת עבור Err כדי לטפל בכישלון:
let result = divide(10, 2);
match result {
Ok(value) => println!("Division successful: {}", value),
Err(error) => println!("Division failed: {}", error),
}כאשר ה־Result הוא Ok, ה־match מחלץ את הערך שהתקבל בהצלחה ומבצע את הזרוע הראשונה. כאשר הוא Err, הוא מחלץ את פרטי השגיאה ומבצע את הזרוע השנייה. התבנית הזו מבטיחה שלא תתעלם בטעות משגיאה אפשרית.
אתגר
קליתקבלו שתי קלטים. הקלט הראשון הוא מספר ( כמחרוזת), והקלט השני הוא מספר נוסף (כמחרוזת). צרו פונקציה שמנסה לחלק את המספר הראשון במספר השני ומחזירה Result<f64, &'static str>. אם המספר השני הוא אפס, החזירו Err עם ההודעה "Division by zero". אחרת, החזירו Ok עם תוצאת החלוקה. השתמשו בביטוי match כדי לטפל במקרים של Ok ושל Err, ולהדפיס את ההודעה המתאימה.
דרישות:
- קראו את הקלט הראשון (מחולק) והסירו רווחים לבנים
- נתחו את הקלט הראשון ל-
f64 - קראו את הקלט השני (מחלק) והסירו רווחים לבנים
- נתחו את הקלט השני ל-
f64 - צרו פונקציה שמקבלת שני פרמטרים מסוג
f64ומחזירהResult<f64, &'static str> - בתוך הפונקציה, בדקו אם המחלק הוא
0.0:- אם כן, החזירו
Err("Division by zero") - אם לא, החזירו
Ok(dividend / divisor)
- אם כן, החזירו
- קראו לפונקציה עם שני המספרים שנותחו
- השתמשו בביטוי
matchכדי לטפל ב-Result - בזרוע
Ok(value), הדפיסו:Result: [value] - בזרוע
Err(error), הדפיסו:Error: [error]
קלט:
- שורה ראשונה: מספר שמייצג את המחולק (לדוגמה,
10.0) - שורה שנייה: מספר שמייצג את המחלק (לדוגמה,
2.0)
פלט:
- אם החלוקה מצליחה:
Result: [result] - אם מתבצעת חלוקה באפס:
Error: Division by zero
נסו בעצמכם
use std::io;
// TODO: צרו כאן את הפונקציה divide שמחזירה Result<f64, &'static str>
fn main() {
// קראו את הקלט הראשון (המספר המחולק)
let mut dividend_input = String::new();
io::stdin().read_line(&mut dividend_input).expect("Failed to read line");
let dividend: f64 = dividend_input.trim().parse().expect("Invalid number");
// קראו את הקלט השני (המחלק)
let mut divisor_input = String::new();
io::stdin().read_line(&mut divisor_input).expect("Failed to read line");
let divisor: f64 = divisor_input.trim().parse().expect("Invalid number");
// TODO: קראו לפונקציה divide והשתמשו ב-match כדי לטפל ב-Result
// הדפיסו "Result: [value]" במקרה של Ok
// הדפיסו "Error: [error]" במקרה של Err
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
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 אונליין