Binding con @
En esta página
Un binding simple (n =>) captura cualquier valor sin restricción. Los rangos
(1..=5) verifican sin capturar. El @ hace ambas cosas al mismo tiempo:
verifica el subpatrón y enlaza el valor a un nombre.
Sintaxis
name @ subpatrón => cuerpo
El subpatrón puede ser un rango, un or-pattern, un literal — cualquier patrón válido. Si el subpatrón no coincide, la rama se ignora normalmente.
@ con rangos numéricos, or-pattern y score con etiqueta.
07-binding-with-at.zolo
// Feature: Binding with `@` — capture AND check a subpattern
// Syntax: `name @ subpattern => ...`
// When to use: you need the value that matched a structured pattern
// (range, literal, or-pattern) — instead of just checking it.
let n = 5
let msg = match n {
x @ 1..=3 => "small: {x}",
x @ 4..=6 => "medium: {x}",
x @ 7..=9 => "large: {x}",
x => "other: {x}",
}
print(msg) // medium: 5
// Binding with or-pattern.
let day = "Saturday"
let label = match day {
d @ ("Saturday" | "Sunday") => "weekend ({d})",
d => "weekday ({d})",
}
print(label) // weekend (Saturday)
// Binding with continuous numeric range.
let score = 92
let r = match score {
s @ 90..=100 => "great ({s})",
s @ 70..=89 => "good ({s})",
s => "bad ({s})",
}
print(r) // great (92)
// expected:
// medium: 5
// weekend (Saturday)
// great (92)
El @ es especialmente útil cuando necesitas usar el valor en una
interpolación de string o cálculo dentro de la rama, sin renunciar a la
verificación estructurada. Compara:
x if x >= 1 && x <= 5 => ...— guarda, funciona pero es más verboso.x @ 1..=5 => ...—@con rango, más declarativo.
Desafío
Reescribe el tercer ejemplo del archivo usando guardas en lugar de @ y compara
la legibilidad. ¿Cuál prefieres para ese caso?