Médio Rust
Enum com dados e match com desestruturação
Enunciado
Defina um enum Mensagem com as variantes Sair, Mover { x: i32, y: i32 } e Escrever(String). Implemente uma função processar(msg: &Mensagem) que imprima uma mensagem adequada para cada variante. Use match exaustivo.
Requisitos
- O enum
Mensagemdeve ter exatamente as três variantes especificadas. - A função
processardeve usarmatche tratar todas as variantes. - Para
Mover, extraiaxeye imprima ambos. - Para
Escrever, extraia o texto e imprima-o. - Para
Sair, imprima uma mensagem de despedida.
Código inicial
enum Mensagem {
Sair,
Mover { x: i32, y: i32 },
Escrever(String),
}
fn processar(msg: &Mensagem) {
// Complete com match
todo!()
}
fn main() {
let m1 = Mensagem::Sair;
let m2 = Mensagem::Mover { x: 10, y: 20 };
let m3 = Mensagem::Escrever(String::from("Olá, Rust!"));
processar(&m1);
processar(&m2);
processar(&m3);
}
Saída esperada
Até logo!
Movendo para (10, 20)
Texto: Olá, Rust!
Ver dica
No match, para a variante Mover, use o padrão Mensagem::Mover { x, y } para extrair os campos. Para Escrever, use Mensagem::Escrever(texto).
Mostrar solução
enum Mensagem {
Sair,
Mover { x: i32, y: i32 },
Escrever(String),
}
fn processar(msg: &Mensagem) {
match msg {
Mensagem::Sair => println!("Até logo!"),
Mensagem::Mover { x, y } => println!("Movendo para ({}, {})", x, y),
Mensagem::Escrever(texto) => println!("Texto: {}", texto),
}
}
fn main() {
let m1 = Mensagem::Sair;
let m2 = Mensagem::Mover { x: 10, y: 20 };
let m3 = Mensagem::Escrever(String::from("Olá, Rust!"));
processar(&m1);
processar(&m2);
processar(&m3);
}
Passo a passo
- O enum
Mensagemtem três variantes: uma sem dados, uma com campos nomeados e uma com umString. - A função
processarrecebe&Mensageme usamatchpara verificar a variante. - No braço
Mensagem::Sair, apenas imprimimos a despedida. - No braço
Mensagem::Mover { x, y }, desestruturamos os camposxeye os usamos na formatação. - No braço
Mensagem::Escrever(texto), extraímos oStringe o imprimimos. - O
matché exaustivo, cobrindo todas as variantes.
Por que funciona
A desestruturação no match permite acessar os dados internos das variantes de forma direta. Como msg é uma referência, o Rust faz auto-deref e os padrões funcionam sem & explícito. A exaustividade garante que nenhum caso seja esquecido.
Erros comuns
- Esquecer de tratar
Sair: o compilador acusanon-exhaustive patterns. - Tentar mover
textopara fora da referência: comomsgé&Mensagem,textoé&String; se tentar usartextocomoStringdiretamente, dará erro. Usetextocomo referência ou clone. - Não usar chaves no padrão
Mover:Mensagem::Mover { x, y }é obrigatório para campos nomeados.
Outra forma de resolver
Usar if let para cada variante, mas seria repetitivo e não exaustivo. O match é mais claro.
Saída esperada
Até logo!
Movendo para (10, 20)
Texto: Olá, Rust!