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 Resultado {
    Ok(i32),
    Erro(String),
}

fn divide_em_dois(n: i32) -> Resultado {
    if n % 2 == 0 {
        Resultado::Ok(n / 2)
    } else {
        Resultado::Erro(format!("não é possível dividir {n} em duas partes iguais"))
    }
}

fn main() {
    let n = 100;
    match divide_em_dois(n) {
        Resultado::Ok(metade) => println!("{n} divido em dois é {metade}"),
        Resultado::Erro(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, metade 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.