07 · Casamento de Padrões
Transforme o valor antes do match
Um padrão (parse_date -> .Ok(date)) aplica o transformador de um argumento à entrada e compara o resultado com o padrão interno. Cada tentativa de um padrão de view chama o transformador uma vez; os bindings bem-sucedidos reutilizam esse resultado. Se não combinar, a execução segue para o próximo braço. O transformador precisa ter tipos concretos e não pode consumir nem produzir recursos lineares. Use-o diretamente no padrão; transformadores de view no corpo de aliases ainda são rejeitados.
Nesta página
Um padrão (parse_date -> .Ok(date)) aplica o transformador de um argumento à entrada e compara o resultado com o padrão interno. Cada tentativa de um padrão de view chama o transformador uma vez; os bindings bem-sucedidos reutilizam esse resultado. Se não combinar, a execução segue para o próximo braço. O transformador precisa ter tipos concretos e não pode consumir nem produzir recursos lineares. Use-o diretamente no padrão; transformadores de view no corpo de aliases ainda são rejeitados.
Exemplo completo
Transforme o valor antes do match.
// Convert incoming fields at the pattern boundary, then match the typed result.
enum Quantity { Valid(int), Invalid }
fn read_quantity(raw: str) -> Quantity {
return match raw {
"one" => Quantity::Valid(1),
"two" => Quantity::Valid(2),
_ => Quantity::Invalid
}
}
fn describe((read_quantity -> .Valid(quantity)): str) -> str = "{quantity} items"
fn describe(_: str) -> str = "unknown quantity"
var total = 0
for case (read_quantity -> .Valid(quantity)) in ["one", "invalid", "two"] {
total += quantity
}
assert(total == 3)
assert(describe("two") == "2 items")
assert(describe("invalid") == "unknown quantity")
print("Accepted {total} items")
Referência
zolo run examples/features/40-syntax-fourth/16-view-patterns.zolo --no-cache
Veja também