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