Inhaltsverzeichnis

Lyx – Pattern Matching (match)

Das match-Statement ist eines der mächtigsten Kontrollfluss-Elemente in Lyx. Es erlaubt den Vergleich eines Wertes gegen eine Reihe von Mustern (Patterns). Im Gegensatz zu switch in C oder Java ist match in Lyx typsicher und exhaustiv (vollständig).

1. Grundlegende Syntax

Ein match-Block prüft einen Ausdruck und führt den ersten passenden Arm aus.

match (error_code) {
    case 0      => { PrintStr("OK"); }
    case 404    => { PrintStr("Not Found"); }
    case 500    => { PrintStr("Server Error"); }
    default     => { PrintStr("Unknown Error"); }
}

2. Matching auf Enums

Besonders stark ist match in Verbindung mit Aufzählungstypen (Enums). Der Compiler prüft hierbei die Exhaustivität.

enum FlightState { Idle, Taxiing, InAir, Landing }
 
fn handle_state(s: FlightState) {
    match (s) {
        case FlightState.Idle    => { stop_engines(); }
        case FlightState.Taxiing => { check_flaps(); }
        case FlightState.InAir   => { retract_gear(); }
        case FlightState.Landing => { deploy_gear(); }
        // Kein 'default' nötig, da alle Enum-Werte abgedeckt sind!
    }
}
 
Compiler-Garantie: Wenn du einen neuen Wert zum Enum FlightState hinzufügst, ohne das match zu aktualisieren, wirft der Compiler einen Fehler (Inexhaustive Match). Dies ist eine wichtige Sicherheitsfunktion für DO-178C.

3. Range-Matching

In Lyx können auch Wertebereiche direkt in den Cases geprüft werden. Dies ist besonders nützlich für die Auswertung von Sensordaten.

match (altitude) {
    case 0..500      => { set_mode(Landing); }
    case 501..30000  => { set_mode(Cruise); }
    case 30001..     => { set_mode(HighAltitude); }
    default          => { panic("Invalid altitude"); }
}

4. Typ-Deconstruction (v0.7.x+)

Lyx erlaubt das „Hineinschauen“ in komplexe Strukturen (Deconstruction), um direkt auf deren Felder zu matchen.

type Event = struct { id: int, active: bool }
 
fn process(e: Event) {
    match (e) {
        case Event { id: 1, active: true }  => { start_system(); }
        case Event { active: false }        => { log_inactive(); }
        default                             => { ignore(); }
    }
}

5. Vergleich: match vs. if-else

Feature match if-else
Lesbarkeit Hoch bei vielen Fällen Hoch bei einfachen Bedingungen
Vollständigkeit Vom Compiler erzwungen Manuell (Fehleranfällig)
Performance Optimiert via Jump-Table Lineare Prüfung (langsam)
Komplexität Unterstützt Deconstruction Nur boolesche Logik

6. Best Practices