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.