Desestruturando Enums

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.

Pontos chave:

  • 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.