07 · Coincidencia de Patrones
Patrones de captura como valores
Guarda un literal pat como valor reutilizable. Su método parse devuelve Result con un record de capturas de tipos exactos. Entrada incompatible y conversiones fallidas devuelven errores estructurados. La construcción retiene las funciones de conversión sin ejecutar sus predicados.
En esta página
Guarda un literal pat como valor reutilizable. Su método parse devuelve Result con un record de capturas de tipos exactos. Entrada incompatible y conversiones fallidas devuelven errores estructurados. La construcción retiene las funciones de conversión sin ejecutar sus predicados.
Ejemplo completo
Patrones de captura como valores.
first-class-capture-patterns.zolo
// Exact public capture record; construction performs no parse or validation.
var input_calls = 0
fn input() -> str { input_calls += 1; "users/9223372036854775807/false" }
let route = pat"users/{id: int}/{ready: bool}"
let captured = route.parse(input()).unwrap()
print(captured.id)
print(captured.ready)
print(input_calls)
print(route.parse("prefix/users/1/true").is_err())
print(route.parse("users/9223372036854775808/true").is_err())
print(route.parse("users/1/true/trailing").is_err())
match route.parse("users/nope/true") {
.Err(error) => { print(error.kind); print(error.input) },
.Ok(_) => print("unexpected"),
}
let id = "outer"
let empty = pat""
print(empty.parse("").is_ok())
print(empty.parse("x").is_err())
let escaped = pat"{{literal}}/{id: str}"
print(escaped.parse(r"{literal}/é中😀").unwrap().id)
print(id)
newtype Positive(int) where |n| n > 0
let positive = pat"n/{value: Positive}"
print(positive.parse("n/3").unwrap().value.unwrap())
print(positive.parse("n/-1").is_err())
var cleanup = ""
struct ScopeResource {}
impl core::cleanup::Cleanup for ScopeResource { fn close(self) { cleanup += "closed" } }
using resource = ScopeResource {} {
let parsed = route.parse("bad")
defer { cleanup += "defer/" }
print(parsed.is_err())
}
print(cleanup)
fn parse_with_cleanup() -> Result<int, { kind: str, input: str, pattern: str }> {
using resource = ScopeResource {} {
defer { cleanup += "defer/" }
let args = route.parse("bad")?;
.Ok(args.id)
}
}
cleanup = ""
print(parse_with_cleanup().is_err())
print(cleanup)
var construction_calls = 0
fn make_route() { construction_calls += 1; pat"users/{id: int}" }
print(make_route().parse("users/8").unwrap().id)
print(construction_calls)
Reglas y comportamiento
Validación, esquemas y unidades · Documentación
Desde un checkout del repositorio:
zolo examples/features/first-class-capture-patterns.zolo
Consulta también