Guardas de Match
Las guardas de match agregan una condición booleana adicional a un brazo de match usando la palabra clave if. Un brazo solo se dispara cuando tanto su patrón coincide como su guarda evalúa a verdadero, permitiendo ramificaciones finas que de otro modo requerirían cadenas anidadas de if-else.
Código
// Match guards: condiciones adicionales dentro de los brazos del match
fn classify(n: int) -> String {
return match n {
x if x > 100 => "muy grande (" + int_to_string(x) + ")",
x if x > 10 => "grande (" + int_to_string(x) + ")",
x if x > 0 => "positivo (" + int_to_string(x) + ")",
x if x == 0 => "cero",
x if x > -10 => "negativo pequeno (" + int_to_string(x) + ")",
x => "muy negativo (" + int_to_string(x) + ")"
}
}
fn grade(score: int) -> String {
return match score {
s if s >= 90 => "A",
s if s >= 80 => "B",
s if s >= 70 => "C",
s if s >= 60 => "D",
_ => "F"
}
}
fn main() -> int {
print(classify(200))
print(classify(50))
print(classify(5))
print(classify(0))
print(classify(-3))
print(classify(-99))
print("nota 95: " + grade(95))
print("nota 82: " + grade(82))
print("nota 71: " + grade(71))
print("nota 55: " + grade(55))
return 0
}
Salida
muy grande (200) grande (50) positivo (5) cero negativo pequeno (-3) muy negativo (-99) nota 95: A nota 82: B nota 71: C nota 55: F
Explicación
Cada brazo del match en classify usa el patrón comodín x para vincular el valor evaluado, y luego aplica una guarda if para restringir cuándo se dispara el brazo. Los brazos se evalúan de arriba hacia abajo, así que el orden importa: x > 100 debe aparecer antes que x > 10, de lo contrario valores como 200 serían capturados primero por la guarda menos específica. El último brazo no tiene guarda, lo que lo convierte en un catch-all incondicional que garantiza la exhaustividad.
La función grade muestra la misma técnica aplicada a una escala de calificación académica. El comodín _ en el último brazo es equivalente a un patrón de variable catch-all pero descarta el valor, señalando a quien lea el código que el valor vinculado se ignora a propósito. Ambas funciones retornan una expresión String directamente desde el match, por lo que no se necesita ninguna variable intermedia.
Las guardas de match son especialmente poderosas cuando se combinan con variantes de enum que llevan datos — primero se puede verificar qué variante se tiene, y luego aplicar una condición numérica o de string sobre su contenido, todo dentro de un único bloque match conciso.