Correspondencia de Patrones

The match keyword lets you match a value against one or more patterns. The comparisons are done from top to bottom and the first match wins.

Los patrones pueden ser valores simples, del mismo modo que switch en C y C++:

#[rustfmt::skip]
fn main() {
    let input = 'x';
    match input {
        'q'                       => println!("Quitting"),
        'a' | 's' | 'w' | 'd'     => println!("Moving around"),
        '0'..='9'                 => println!("Number input"),
        key if key.is_lowercase() => println!("Lowercase: {key}"),
        _                         => println!("Something else"),
    }
}

The _ pattern is a wildcard pattern which matches any value. The expressions must be irrefutable, meaning that it covers every possibility, so _ is often used as the final catch-all case.

Match can be used as an expression. Just like if, each match arm must have the same type. The type is the last expression of the block, if any. In the example above, the type is ().

A variable in the pattern (key in this example) will create a binding that can be used within the match arm.

A match guard causes the arm to match only if the condition is true.

This slide should take about 10 minutes.

Puntos Clave:

  • Puedes señalar cómo se usan algunos caracteres concretos en un patrón

    • | como or,
    • .. se puede ampliar tanto como sea necesario.
    • 1..=5 representa un rango inclusivo.
    • _ es un comodín.
  • Las guardas de coincidencia, como característica sintáctica independiente, son importantes y necesarios cuando queremos expresar de forma concisa ideas más complejas de lo que permitirían los patrones por sí solos.

  • No son lo mismo que una expresión if independiente dentro del brazo de coincidencias. Una expresión if dentro del bloque de ramas (después de =>) se produce tras seleccionar el brazo de coincidencias. Si no se cumple la condición if dentro de ese bloque, no se tienen en cuenta otros brazos de la expresión match original.

  • La condición definida en el guarda se aplica a todas las expresiones de un patrón con un |.