capypad
0 Tage Serie
rust / intermediate
Snippet

Enum mit Daten-Varianten

Rust-Enums können verschiedene Datentypen in jeder Variante halten. Quit hat keine Daten, Move enthält benannte Felder, Write hält einen String, und ChangeColor hält drei u8-Werte. Pattern Matching extrahiert Werte aus den Varianten.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(u8, u8, u8),
}
 
fn process(msg: Message) {
match msg {
Message::Quit => println!("Quit requested"),
Message::Move { x, y } => println!("Move to ({}, {})", x, y),
Message::Write(text) => println!("Write: {}", text),
Message::ChangeColor(r, g, b) => println!("Color: RGB({}, {}, {})", r, g, b),
}
}
 
fn main() {
let msgs = vec![
Message::Quit,
Message::Move { x: 10, y: 20 },
Message::Write(String::from("Hello")),
Message::ChangeColor(255, 128, 0),
];
for msg in msgs {
process(msg);
}
}
Erklärung
1
enum Message {
Definiert ein Enum mit vier verschiedenen Varianten
2
Message::Move { x: i32, y: i32 }
Variante mit benannten Feldern wie eine Struktur
3
Message::Write(String)
Variante, die einen einzelnen String-Wert hält
4
match msg {
Erschöpfendes Pattern Matching auf Enum-Varianten
5
Message::Move { x, y } =>
Dekonstruiert die benannten Felder aus der Move-Variante