Achtergrond
De match-operator in Rust is een krachtige tool voor patroonmatching, ontleend aan functionele talen. In tegenstelling tot vergelijkbare constructies in C/C++ voegt Rust strikte controle op exhaustiviteit (exhaustiveness checking) toe, wat betekent dat voor elke mogelijke variant er een tak moet zijn.
Probleem
Fouten bij het gebruik van match zijn vaak gerelateerd aan het verkeerd in rekening brengen van alle varianten van een type (bijvoorbeeld een enum), onjuiste omgang met guards (voorwaarden voor takken) of complexe geneste structuren. Onjuiste verwerking leidt tot fouten tijdens de compilatie of tot impliciet onjuiste logica.
Oplossing
_).if na het patroon).Voorbeeldcode:
enum Shape { Circle(f64), Rectangle { width: f64, height: f64 }, } fn print_area(s: Shape) { match s { Shape::Circle(r) if r > 0.0 => println!("area = {}", 3.14 * r * r), Shape::Rectangle { width, height } if width > 0.0 && height > 0.0 => println!("area = {}", width * height), _ => println!("invalid shape"), } }
Belangrijke kenmerken:
Beïnvloedt de volgorde van takken in match de uitvoering?
Ja, de volgorde van takken is belangrijk: zodra de eerste overeenkomst is gevonden, worden de daaropvolgende niet meer gecontroleerd. Dit is vooral kritisch met pattern guards — als er eerder een tak met een guard staat, vangt deze de waarde eerder dan de catch-all.
Is een catch-all (_) verplicht bij matchen op enums?
Nee, als je expliciet alle gevallen hebt doorgelopen (en de type-definities in de toekomst niet zullen veranderen). Echter, catch-all is nodig bij het werken met types waarbij extra waarden kunnen komen, of wanneer je niet alle takken expliciet wilt verwerken.
Kun je meerdere patronen (alternatieven) in één match-tak gebruiken?
Ja. Met een verticale streep (|) kun je patronen combineren:
match x { 1 | 2 | 3 => println!("one, two or three"), _ => println!("something else"), }
_ te vroeg gebruiken (voor specifieke takken)Een ontwikkelaar schreef een match met catch-all aan het begin en kon specifieke gevallen niet correct verwerken.
Voordelen:
Het programma compileert.
Nadelen:
Specifieke logica werkt nooit, een deel van de code wordt niet gedekt.
Expliciete verwerking van alle varianten van enums, catch-all alleen als laatste tak, individuele guards voor atypische gevallen.
Voordelen:
Voorspelbaarheid, de compiler helpt om geen variant te vergeten, gemakkelijk om types uit te breiden.
Nadelen:
Extra sjablooncode bij een groot aantal varianten.