56 lines
1.2 KiB
Rust
56 lines
1.2 KiB
Rust
// Patterns können beliebig tief verschachtelt werden:
|
||
// Structs in Enums in Options – alles in einem match.
|
||
|
||
enum Inhalt {
|
||
Text(String),
|
||
Zahl(i32),
|
||
}
|
||
|
||
struct Paket {
|
||
absender: String,
|
||
inhalt: Option<Inhalt>,
|
||
}
|
||
|
||
fn oeffne(p: &Paket) {
|
||
match p {
|
||
// Option UND Enum gleichzeitig destrukturieren
|
||
Paket {
|
||
absender,
|
||
inhalt: Some(Inhalt::Text(t)),
|
||
} => {
|
||
println!("Von {absender}: Text \"{t}\"");
|
||
}
|
||
Paket {
|
||
absender,
|
||
inhalt: Some(Inhalt::Zahl(n)),
|
||
} => {
|
||
println!("Von {absender}: Zahl {n}");
|
||
}
|
||
// .. deckt restliche Felder ab (hier: absender)
|
||
Paket { inhalt: None, .. } => {
|
||
println!("Leeres Paket.");
|
||
}
|
||
}
|
||
}
|
||
|
||
fn main() {
|
||
let pakete = vec![
|
||
Paket {
|
||
absender: "Alice".into(),
|
||
inhalt: Some(Inhalt::Text("Hallo".into())),
|
||
},
|
||
Paket {
|
||
absender: "Bob".into(),
|
||
inhalt: Some(Inhalt::Zahl(99)),
|
||
},
|
||
Paket {
|
||
absender: "Eve".into(),
|
||
inhalt: None,
|
||
},
|
||
];
|
||
|
||
for p in &pakete {
|
||
oeffne(p);
|
||
}
|
||
}
|