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 um enum que é posteriormente descompactado com um match.
  • 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ável result e faça uma correspondência de padrão (match) em um loop. Isso não irá compilar porque msg é consumido quando correspondido. Para corrigir, faça uma correspondência de padrão em &result ao invés de result. Isso fará com que msg 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, substitua msg por ref msg no padrão.