Η μεταφραστική κάλυψη είναι μερική. Για την πλήρη τεχνική αναφορά συμβουλευτείτε την αγγλική πηγή. Δείτε την αγγλική έκδοση →

Αντιστοίχιση προτύπων

Εξαντλητική αντιστοίχιση προτύπων με εκφράσεις `match`, guards και ένθετα patterns.

Αντιστοίχιση προτύπων

Η έκφραση match παρέχει εξαντλητικό pattern matching πάνω σε τιμές. Ο compiler ελέγχει ότι καλύπτονται όλες οι περιπτώσεις και προειδοποιεί για μη προσβάσιμα arms.

Βασικό matching

fn describe(x: i32) -> i64 {
    match x {
        0 => 0,
        1 => 1,
        _ => 2,
    }
}

Το wildcard _ ταιριάζει με οποιαδήποτε τιμή και χρησιμοποιείται ως catch-all.

Matching σε enums

enum Shape {
    Circle(f64),
    Rectangle(f64, f64),
    Triangle(f64, f64, f64),
}

fn sqrt(x: f64) -> f64 { x }

fn area(s: Shape) -> f64 {
    match s {
        Shape::Circle(r) => 3.14159 * r * r,
        Shape::Rectangle(w, h) => w * h,
        Shape::Triangle(a, b, c) => {
            let s = (a + b + c) / 2.0
            sqrt(s * (s - a) * (s - b) * (s - c))
        },
    }
}

Αν παραλείψετε ένα variant, ο compiler αναφέρει σφάλμα για μη εξαντλητικό matching.

Guards

Τα arms ενός pattern μπορούν να περιλαμβάνουν if guards για επιπλέον συνθήκες:

fn classify_temp(celsius: f64) -> i64 {
    match celsius {
        t if t < 0.0 => 0,
        t if t < 20.0 => 1,
        t if t < 35.0 => 2,
        _ => 3,
    }
}

Matching σε structs

struct Point { x: f64, y: f64 }

fn quadrant(p: Point) -> i64 {
    match p {
        Point { x, y } if x > 0.0 && y > 0.0 => 1,
        Point { x, y } if x < 0.0 && y > 0.0 => 2,
        Point { x, y } if x < 0.0 && y < 0.0 => 3,
        Point { x, y } if x > 0.0 && y < 0.0 => 4,
        _ => 0,
    }
}

Τρέχοντες περιορισμοί

  • Η αποδόμηση tuples σε let bindings (let (a, b) = pair) δεν υποστηρίζεται ακόμα. Χρησιμοποιήστε match αντ’ αυτού.
  • Το εμφωλευμένο pattern matching σε βαθιά εμφωλευμένα structs λειτουργεί, αλλά ο εξαντλητικός έλεγχος δεν καλύπτει ακόμα όλες τις περιπτώσεις.
  • Τα or-patterns (A | B => ...) αναγνωρίζονται από τον parser, αλλά ο έλεγχος κάλυψης γι’ αυτά βρίσκεται ακόμα σε ωρίμανση.