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.