Teil 16: Enums und match
Lernziel: Programmzustände sicher abbilden.
Voraussetzungen: Die vorherigen Lektionen, insbesondere Teil 15.
Worum geht es?
Mit enum legst du fest, welche Zustände möglich sind. match verarbeitet diese vollständig.
Schritt für Schritt
enum Status {
Aus,
Aufheizen,
Drucken { fortschritt: u8 },
Fertig,
}
fn beschreibe(status: Status) {
match status {
Status::Aus => println!("Ausgeschaltet"),
Status::Aufheizen => println!("Heizt auf"),
Status::Drucken { fortschritt } => println!("Druckt: {fortschritt}%"),
Status::Fertig => println!("Fertig"),
}
}
fn main() {
beschreibe(Status::Drucken { fortschritt: 42 });
}
match ist erschöpfend: Jeder mögliche Zustand muss behandelt werden. Rust meldet vergessene Varianten beim Kompilieren.
Muster mit if let
Wenn du nur einen Fall behandeln möchtest, ist if let oft kompakter:
let status = Status::Fertig;
if let Status::Fertig = status { println!("Bereit zur Entnahme"); }
Du kannst später über Option<T> und Result<T, E> ebenfalls mit match entscheiden.
Selbst ausprobieren
Erweitere das Enum um Fehler(String) und gib bei diesem Zustand die Fehlermeldung aus.
Musterlösung anzeigen
enum Status { Bereit, Fehler(String) }
fn main() {
let status = Status::Fehler("Filament leer".into());
match status {
Status::Bereit => println!("Bereit"),
Status::Fehler(text) => println!("Fehler: {text}"),
}
}
Das solltest du mitnehmen
- Programmzustände sicher abbilden.
- Nutze
cargo runfür das Ausführen undcargo checkfür eine schnelle Fehlerprüfung (ab Teil 4). - Experimentiere mit veränderten Werten und beobachte die Compilermeldungen.
