21.17 Nested Patterns
Patterns can be nested to match deeply within complex data structures simultaneously.
enum Status { Ok, Error(String), } struct Response { status: Status, data: Option<Vec<u8>>, } fn handle_response(response: Response) { match response { // Nested pattern: Match Response struct, then Status::Ok, then Some(data) Response { status: Status::Ok, data: Some(payload) } => { println!("Success with payload size: {} bytes", payload.len()); // `payload` is the Vec<u8> } // Match Ok status, but no data Response { status: Status::Ok, data: None } => { println!("Success with no data."); } // Match Error status, bind the message, ignore data field Response { status: Status::Error(msg), .. } => { println!("Operation failed: {}", msg); // `msg` is the String from Status::Error } } } fn main() { let resp1 = Response { status: Status::Ok, data: Some(vec![1, 2, 3]) }; let resp2 = Response { status: Status::Ok, data: None }; let resp3 = Response { status: Status::Error("Timeout".to_string()), data: None }; handle_response(resp1); // Output: Success with payload size: 3 bytes handle_response(resp2); // Output: Success with no data. handle_response(resp3); // Output: Operation failed: Timeout }
This allows highly specific conditions involving multiple levels of a data structure to be expressed clearly in a single match arm.