שיעורי מודול (2/2)
התאמת דפוסים, אפשרות ותוצאה
לחלודה מנגנון זרימת בקרה חזק במיוחד הנקרא התאמת דפוסים. זה מאפשר לך להשוות ערך מול סדרה של דפוסים ולהפעיל קוד על סמך איזה דפוס מתאים.
ההצהרה match
ההצהרה match ב-Rust דומה ל-switch בשפות אחרות, אבל הרבה יותר חזקה ובטוחה. המהדר מבטיח שההתאמה ממצה, כלומר יש לטפל בכל המקרים האפשריים:
enum Direction {
North,
South,
East,
West,
}
let dir = Direction::East;
match dir {
Direction::North => println!("Andiamo a Nord"),
Direction::South => println!("Andiamo a Sud"),
Direction::East => println!("Andiamo a Est"),
Direction::West => println!("Andiamo a Ovest"),
}טיפול בהיעדר ערך: Option
לחלודה אין מושג של ערך ריק (null או nil). במקום זאת, הספרייה הסטנדרטית מגדירה רשומה בשם Option<T> שיכול להכיל:
Some(T): מכיל ערך מסוגT.None: מציין את היעדר ערך.
let x: Option<i32> = Some(5);
let y: Option<i32> = None;
match x {
Some(val) => println!("C'e un valore: {}", val),
None => println!("Nessun valore trovato"),
}טיפול בשגיאות הניתנות לשחזור: Result
עבור פעולות שעלולות להיכשל (כמו קריאת קובץ או ניתוח מחרוזת למספר), Rust משתמש ברשומה Result<T, E>, שיש לה שתי גרסאות:
Ok(T): הפעולה הצליחה ומכילה את ערך ההצלחהT.Err(E): הפעולה נכשלה ומכילה את השגיאהE.
fn divide(numerator: f64, denominator: f64) -> Result<f64, String> {
if denominator == 0.0 {
Err(String::from("Divisione per zero!"))
} else {
Ok(numerator / denominator)
}
}הודות למהדר של Rust, אתה נאלץ לטפל במקרה Err לפני שתוכל לגשת לערך בתוך Ok, ולמנוע באגים נפוצים רבים בזמן ריצה.
תבנית התווים הכלליים _
כשעובדים עם סוגי נתונים שיש להם מספר רב של גרסאות (כמו מספרים שלמים), אי אפשר לרשום את כל המקרים ב-match. חלודה מאפשרת שימוש בתו הכללי _ כדי לתפוס את כל המקרים הנותרים שאינם מוגדרים במפורש:
let some_u8 = 3u8;
match some_u8 {
1 => println!("One"),
2 => println!("Two"),
_ => println!("Something else"), // Handles all other values
}נסה זאת בעצמך
הכריז על משתנה בשם maybe_value מסוג Option<i32> המכיל Some(42). השתמש במשפט התאמה על maybe_value: אם הוא מכיל Some(v) הדפס 'ערך הוא: v' (באמצעות println!), אם הוא מכיל None הדפס 'אין ערך'.
הצג רמז
כתוב בלוק `match maybe_value { Some(v) => println!('value is: {}', v), None => println!('no value') }`.
הפתרון זמין לאחר 3 ניסיונות
השלם את הפונקציה check_age כך שהיא תחזיר את Ok('Adult') אם הגיל גדול או שווה ל-18, ו-Err('Minor') אחרת.
הצג רמז
השתמש ב-`if age >= 18`כדי להחליט אם להחזיר `Ok('Adult')`or`Err('Minor')`.
הפתרון זמין לאחר 3 ניסיונות
הכריז על מנה בשם סטטוס המכיל את הווריאציות Active ו-Inactive. ב-main, הכריז על משתנה current_status עם הערך Status::Active. לבסוף, השתמש בהצהרת התאמה ב-current_status כדי להדפיס 'פעיל' אם הסטטוס הוא פעיל, או 'לא פעיל' אם הסטטוס אינו פעיל.
הצג רמז
הגדר את ה-enum לפני main עם `enum Status { Active, Inactive }`. ב-main, השתמש ב-'let current_status = Status::Active;'ובצע את ה'התאמה' בגרסאות.
הפתרון זמין לאחר 3 ניסיונות