capypad
0 Tage Serie
rust / intermediate
Snippet

Musterabgleich mit Match-Ausdrücken

Match-Ausdrücke in Rust bieten leistungsstarke Musterabgleich-Fähigkeiten. Sie können auf Enum-Varianten matchen, Wächterklauseln mit 'if'-Bedingungen einbeziehen und komplexe Daten direkt im Muster destruktorisieren. Der Compiler prüft die Vollständigkeit, was bedeutet, dass alle möglichen Fälle behandelt werden müssen, sonst kompiliert der Code nicht. Dies macht Musterabgleich sowohl ausdrucksstark als auch sicher.

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
28
29
30
31
#[derive(Debug)]
enum Color {
RGB(u8, u8, u8),
Hex(String),
Named(String),
}
 
fn describe_color(color: &Color) -> String {
match color {
Color::RGB(r, g, b) if r == g && g == b => {
format!("Grayscale: r={}, g={}, b={}", r, g, b)
}
Color::RGB(r, g, b) => format!("RGB: #{:02x}{:02x}{:02x}", r, g, b),
Color::Hex(code) if code.starts_with('#') => format!("Hex color: {}", code),
Color::Hex(code) => format!("Invalid hex: {}", code),
Color::Named(name) => format!("Named color: {}", name),
}
}
 
fn main() {
let colors = vec![
Color::RGB(255, 0, 0),
Color::RGB(128, 128, 128),
Color::Hex(String::from("#00FF00")),
Color::Named(String::from("azure")),
];
for c in &colors {
println!("{:?}: {}", c, describe_color(c));
}
}
Erklärung
1
#[derive(Debug)]
Derive-Makro zur Implementierung des Debug-Traits für druckbare Enum-Darstellung
2
enum Color { RGB(u8, u8, u8), ... }
Enum-Definition mit Tupel-Varianten für RGB-Werte und String-Varianten
3
match color { ... }
Match-Ausdruck zur Auswertung des Color-Enum-Werts
4
Color::RGB(r, g, b) if r == g && g == b =>
Muster mit Wächterklausel: matcht Grautöne wo alle Kanäle gleich sind
5
Color::Hex(code) if code.starts_with('#') =>
Wächterklausel prüft String-Inhalt nach Destrukturierung
6
format!("...", r, g, b)
Makro zur Formatierung von RGB-Werten als Hexadezimal-Farbcode