דילוג לתוכן המרכזי
מודול 2 · שיעור 2 מתוך 24/14 בקורס~15 min
שיעורי מודול (2/2)

התאמת דפוסים, אפשרות ותוצאה

לחלודה מנגנון זרימת בקרה חזק במיוחד הנקרא התאמת דפוסים. זה מאפשר לך להשוות ערך מול סדרה של דפוסים ולהפעיל קוד על סמך איזה דפוס מתאים.

ההצהרה match

ההצהרה match ב-Rust דומה ל-switch בשפות אחרות, אבל הרבה יותר חזקה ובטוחה. המהדר מבטיח שההתאמה ממצה, כלומר יש לטפל בכל המקרים האפשריים:

Rust
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: מציין את היעדר ערך.
Rust
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.
Rust
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. חלודה מאפשרת שימוש בתו הכללי _ כדי לתפוס את כל המקרים הנותרים שאינם מוגדרים במפורש:

Rust
let some_u8 = 3u8;
match some_u8 {
    1 => println!("One"),
    2 => println!("Two"),
    _ => println!("Something else"), // Handles all other values
}

נסה זאת בעצמך

פעילות גופנית#rust.m2.l2.e1
ניסיונות: 0טוען...

הכריז על משתנה בשם 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 ניסיונות

פעילות גופנית#rust.m2.l2.e2
ניסיונות: 0טוען...

השלם את הפונקציה check_age כך שהיא תחזיר את Ok('Adult') אם הגיל גדול או שווה ל-18, ו-Err('Minor') אחרת.

טוען עורך...
הצג רמז

השתמש ב-`if age >= 18`כדי להחליט אם להחזיר `Ok('Adult')`or`Err('Minor')`.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#rust.m2.l2.e3
ניסיונות: 0טוען...

הכריז על מנה בשם סטטוס המכיל את הווריאציות Active ו-Inactive. ב-main, הכריז על משתנה current_status עם הערך Status::Active. לבסוף, השתמש בהצהרת התאמה ב-current_status כדי להדפיס 'פעיל' אם הסטטוס הוא פעיל, או 'לא פעיל' אם הסטטוס אינו פעיל.

טוען עורך...
הצג רמז

הגדר את ה-enum לפני main עם `enum Status { Active, Inactive }`. ב-main, השתמש ב-'let current_status = Status::Active;'ובצע את ה'התאמה' בגרסאות.

הפתרון זמין לאחר 3 ניסיונות