21.10 Match Guards: Adding if
Conditions
A match guard is an additional if condition
applied to a match
arm, placed after the pattern. The arm executes only if the pattern matches and the guard expression evaluates to true
.
struct SensorReading { id: u32, value: f64, is_critical: bool, } fn process_reading(reading: SensorReading) { match reading { // Pattern: Matches any SensorReading where is_critical is true // Guard: Adds condition on the value SensorReading { id, value, is_critical: true } if value > 100.0 => { println!("High critical reading from sensor {}: {}", id, value); } // Pattern: Matches any critical reading (guard already handled high values) SensorReading { id, is_critical: true, .. } => { println!("Normal critical reading from sensor {}.", id); } // Pattern: Matches any non-critical reading SensorReading { id, value, is_critical: false } => { println!("Non-critical reading from sensor {}: {}", id, value); } } } fn main() { process_reading(SensorReading { id: 1, value: 105.5, is_critical: true }); // Output: High critical reading... process_reading(SensorReading { id: 2, value: 50.0, is_critical: true }); // Output: Normal critical reading... process_reading(SensorReading { id: 3, value: 30.0, is_critical: false }); // Output: Non-critical reading... }
Variables bound in the pattern (like id
and value
) are available within the guard’s condition. Guards allow expressing conditions that are difficult or impossible to encode directly within the pattern structure itself.