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.
Puntos Clave:
-
Puedes señalar cómo se usan algunos caracteres concretos en un patrón
|
comoor
,..
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ónif
dentro del bloque de ramas (después de=>
) se produce tras seleccionar el brazo de coincidencias. Si no se cumple la condiciónif
dentro de ese bloque, no se tienen en cuenta otros brazos de la expresiónmatch
original. -
La condición definida en el guarda se aplica a todas las expresiones de un patrón con un
|
.