Rust Tipos Básico
Enums e match
Em Rust, enum é uma forma de definir um tipo que pode ser um entre vários valores possíveis. Diferente de outras linguagens, cada variante pode carregar dados próprios, como números, strings ou até outras estruturas. Isso permite modelar estados de forma segura e expressiva.
O match é a ferramenta principal para lidar com enums. Ele compara um valor com uma série de padrões e executa o código correspondente. O compilador exige que o match seja exaustivo, ou seja, todas as variantes possíveis devem ser tratadas, evitando esquecimentos.
Para casos em que apenas uma variante interessa, o if let oferece uma sintaxe mais concisa que um match completo. Ele executa um bloco apenas se o padrão casar, ignorando as demais possibilidades.
Padrões podem ser simples (como Variante) ou complexos (como Variante { campo, .. }), permitindo extrair e usar os dados internos de forma direta e segura.
Pontos-chave
enumdefine um tipo que pode assumir uma entre várias variantes, cada uma podendo ter dados associados.- O
matché exaustivo: o compilador força o tratamento de todas as variantes. if leté um atalho para quando apenas uma variante interessa, evitando ummatchcompleto.- Padrões podem desestruturar dados internos das variantes, como
Mensagem::Mover { x, y }. - Use
_como curinga para ignorar valores que não importam nomatch.
// Exemplo de enum com dados e match exaustivo
enum Forma {
Circulo(f64),
Retangulo { largura: f64, altura: f64 },
}
fn area(forma: &Forma) -> f64 {
match forma {
Forma::Circulo(raio) => std::f64::consts::PI * raio * raio,
Forma::Retangulo { largura, altura } => largura * altura,
}
}
fn main() {
let c = Forma::Circulo(2.0);
let r = Forma::Retangulo { largura: 3.0, altura: 4.0 };
println!("Área do círculo: {:.2}", area(&c));
println!("Área do retângulo: {:.2}", area(&r));
// if let: só interessa se for Círculo
if let Forma::Circulo(raio) = c {
println!("O círculo tem raio {}", raio);
}
}