Lição 5: Modelagem de domínio com struct e enum
Um domínio real tem estados que não devem ser confundidos: uma conta pode ser individual, conjunta ou encerrada. struct agrupa dados; enum descreve alternativas; match força o código a tratar cada variante.
Objetivo
Em uma frase: criar dados compostos e destrinchá-los de forma exaustiva e segura.
Código
struct Usuario {
nome: str
saldo: int
}
enum Conta {
Individual(Usuario),
Conjunta(Usuario, Usuario),
Encerrada,
}
enum com dados embutidos permite representar variações de forma limpa. Vamos desestruturar com match:
public func descrever(conta: ref Conta): str {
return match conta {
Conta.Individual(u) => "Individual de " + u.nome,
Conta.Conjunta(u1, u2) => "Conjunta de " + u1.nome + " e " + u2.nome,
Conta.Encerrada => "Encerrada",
}
}
Experimente
Remova o caso .Encerrada do match. O compilador acusa o problema: o match não cobre todos os casos. Exaustividade garantida em tempo de compilação.
Esse é o compilador evitando um bug clássico: adicionar uma variante a um enum e esquecer de tratá-la em algum lugar. Sem match exaustivo, isso passaria despercebido.
Com struct, enum e match, você modela domínios complexos e transforma uma regra de exaustividade em garantia de compilação. Se o domínio mudar, o compilador aponta os lugares que precisam acompanhar a mudança.
Próximos passos
Você já viu os pilares. Para consultar tipos, operadores e a gramática completa, veja a reference.