Enums (Enumerações)
Como tuplas, enums também podem ser desestruturados por meio de correspondência:
Os padrões também podem ser usados para vincular variáveis a partes de seus valores. É assim que você inspeciona a estrutura de seus tipos. Vamos começar com um tipo enum
simples:
enum Result { Ok(i32), Err(String), } fn divide_in_two(n: i32) -> Result { if n % 2 == 0 { Result::Ok(n / 2) } else { Result::Err(format!("não é possível dividir {n} em duas partes iguais")) } } fn main() { let n = 100; match divide_in_two(n) { Result::Ok(half) => println!("{n} divido em dois é {half}"), Result::Err(msg) => println!("desculpe, aconteceu um erro: {msg}"), } }
Aqui usamos a verificação de correspondência para desestruturar o valor contido em Result
. Na primeira verificação de correspondência, half
está vinculado ao valor dentro da variante Ok
. Na segunda, msg
está vinculado à mensagem de erro.
This slide should take about 4 minutes.
- A expressão
if
/else
está retornando umenum
que é posteriormente descompactado com ummatch
. - Você pode tentar adicionar uma terceira variante à definição de Enum e exibir os erros ao executar o código. Aponte os lugares onde seu código agora é “não exaustivo” e como o compilador tenta lhe dar dicas.
- Os valores nas variantes de uma enum só podem ser acessados após uma correspondência de padrão.
- Demonstre o que acontece quando a busca não abrange todas as possibilidades. Observe a vantagem que o compilador Rust fornece ao confirmar quando todos os casos são tratados.
- Salve o resultado de
divide_in_two
na variávelresult
e faça uma correspondência de padrão (match
) em um loop. Isso não irá compilar porquemsg
é consumido quando correspondido. Para corrigir, faça uma correspondência de padrão em&result
ao invés deresult
. Isso fará com quemsg
seja uma referência, de forma que não será consumido. Essa “ergonomia de correspondência” apareceu no Rust 2018. Se você quiser suportar versões mais antigas do Rust, substituamsg
porref msg
no padrão.