Pattern matching w Rust pozwala na rozbicie wartości według struktury, analizowanie i przetwarzanie złożonych typów za pomocą konstrukcji match, if let, while let. Destrukturyzacja (rozkład na części) jest wygodna w pracy z krotkami, strukturami, enum'ami, a nawet referencjami.
Przykład z enum:
enum Message { Quit, ChangeColor(i32, i32, i32), Write(String), } let m = Message::ChangeColor(255, 0, 0); match m { Message::Quit => println!("Quit!"), Message::ChangeColor(r, g, b) => println!("Kolor: {} {} {}", r, g, b), Message::Write(text) => println!("Tekst: {}", text), }
Destrukturyzacja struktur:
struct Point { x: i32, y: i32 } let p = Point { x: 10, y: 20 }; let Point { x, y } = p;
Niuanse:
ref i ref mut pozwala na uzyskanie referencji podczas rozkładu.@ można "przemianować" część wzorca.if guard).&SomeType) — ważne jest pamiętanie o własności i borrowing.Czy zawsze można używać "_" (podkreślenie), aby ignorować części wzorca i unikać ostrzeżeń kompilatora?
Nie zawsze. Podkreślenie rzeczywiście pomija wartość, ale jeśli nie obsługujesz wszystkich wariantów enum'a i używasz "_" jako catch-all, możesz pominąć obsługę nowych wariantów podczas rozszerzania enum w przyszłości. Lepiej zawsze jawnie wypisywać ważne warianty, aby kompilator ostrzegał o nieprzetworzonych przypadkach!
match result { Ok(val) => ..., Err(err) => ..., //_ => ... // niezalecane dla enum! }
Historia
W aplikacji IoT urządzenie przestało odpowiadać, ponieważ przy dodawaniu nowego wariantu enum w miejscu pattern matching używano catch-all "_". Błąd pozostał niewidoczny do momentu wdrożenia. Po tym krytyczne enum'y zawsze były rozpatrywane tylko z jawny przebieg wariantów.
Historia
Dla złożonej struktury z zagnieżdżonymi krotkami zapomniano dodać składnię destrukturyzacji rekurencyjnych pól, i zamiast uzyskania referencji kody przypadkowo klonowały duże obiekty, co prowadziło do spadku wydajności.
Historia
W jednym z funkcji przesyłania wiadomości między wątkami używano destrukturyzacji przez if-let, ale ignorowano rzadkie warianty enum. Przy pojawieniu się nowej logiki biznesowej wiadomości po prostu ginęły. Po tym w stylu zespołowym wprowadzono zasadę — każde wyrażenie match musi być wyczerpujące bez catch-all.