21.6 Matching Enums
match
is particularly powerful with enums, allowing clean handling of different variants and their associated data.
enum AppEvent { KeyPress(char), Click { x: i32, y: i32 }, Quit, } fn handle_event(event: AppEvent) { match event { AppEvent::KeyPress(c) => { // Destructure the char println!("Key pressed: '{}'", c); } AppEvent::Click { x, y } => { // Destructure fields using punning println!("Mouse clicked at ({}, {})", x, y); } AppEvent::Quit => { println!("Quit event received."); } } } fn main() { handle_event(AppEvent::KeyPress('q')); handle_event(AppEvent::Click { x: 100, y: 250 }); handle_event(AppEvent::Quit); }
Matching Result<T, E>
follows the same principle:
fn divide(numerator: f64, denominator: f64) -> Result<f64, String> { if denominator == 0.0 { Err("Division by zero".to_string()) } else { Ok(numerator / denominator) } } fn main() { let result1 = divide(10.0, 2.0); match result1 { Ok(value) => println!("Result: {}", value), // Output: Result: 5 Err(msg) => println!("Error: {}", msg), } let result2 = divide(5.0, 0.0); match result2 { Ok(value) => println!("Result: {}", value), Err(msg) => println!("Error: {}", msg), // Output: Error: Division by zero } }
Again, the compiler enforces that both Ok
and Err
variants are handled.