Conteúdos Variantes
Você pode definir enums mais ricos onde as variantes carregam dados. Você pode então usar a instrução match
(corresponder) para extrair os dados de cada variante:
enum EventoWeb { CarregarPagina, // Variante sem conteúdo TeclaPressionada(char), // Variante tupla Clique { x: i64, y: i64 }, // Variante completa } #[rustfmt::skip] fn inspecionar(evento: EventoWeb) { match evento { EventoWeb::CarregarPagina => println!("página carregada"), EventoWeb::TeclaPressionada(c) => println!("pressionou '{c}'"), EventoWeb::Clique { x, y } => println!("clicou em x={x}, y={y}"), } } fn main() { let carregar = EventoWeb::CarregarPagina; let pressionar = EventoWeb::TeclaPressionada('x'); let clicar = EventoWeb::Clique { x: 20, y: 80 }; inspecionar(carregar); inspecionar(pressionar); inspecionar(clicar); }
- Os valores nas variantes de uma enum só podem ser acessados após uma correspondência de padrão. O padrão vincula referências aos campos no “braço” do match após
=>
.- A expressão é comparada com os padrões de cima a baixo. Não existe fall-through como em C ou C++.
- A expressão match possui um valor. O valor é o da última expressão executada em um “braço” do match.
- Começando do topo, nós procuramos qual padrão corresponde ao valor, e então executamos o código após a flecha. Quando uma correspondência é encontrada, nós paramos.
- Demonstre o que acontece quando a busca não abrange todas as possibilidades. Mencione a vantagem que o compilador do Rust oferece confirmando quando todos os casos foram tratados.
match
inspeciona um campo discriminant escondido naenum
.- É possível recuperar o discriminante chamando
std::mem::discriminant()
- Isso é útil, por exemplo, ao implementar
PartialEq
para structs nas quais comparar valores de campos não afeta a igualdade.
- Isso é útil, por exemplo, ao implementar
EventoWeb::Clique { ... }
não é exatamente o mesmo queEventoWeb::Clique(Clique)
com umastruct Clique { ... }
top-level. A versão no próprio local (inline) não permite implementar traits, por exemplo.