🧩 Exercícios: Enums, Option, Result e Pattern Matching
Spec Sistemas Com Rust • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 10.1 — Enums com Dados Associados e Pattern Matching com match
Contexto: Enums com Dados Associados e Pattern Matching com match no contexto de Enums, Option, Result e Pattern Matching.
Requisitos de Execução:
- Declarar enum
Mensagemcom variantes contendo tuplas e structs e desestruturar nomatch.
Resultado Esperado
Enum com dados associados processado exaustivamente no match.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_1_SeuNome - Envie na tarefa:
Atividade Cap 10 - Enums, Option, Result e Pattern Matching
🔑 Gabarito de Código & Solução Comentada
// enums_match.rs
enum Comando {
Sair,
Mover { x: i32, y: i32 },
Escrever(String),
}
fn processar(cmd: Comando) {
match cmd {
Comando::Sair => println!("Comando: Sair"),
Comando::Mover { x, y } => println!("Mover para ({}, {})", x, y),
Comando::Escrever(msg) => println!("Texto: {}", msg),
}
}
fn main() {
processar(Comando::Mover { x: 10, y: 20 });
}
🔍 Nível 2: Prática
Problema 10.2 — Tratamento Seguro com Option e if let
Contexto: Tratamento Seguro com Option
Requisitos de Execução:
- Utilizar
if let Some(valor) = buscar()para tratamento conciso de valores opcionais.
Resultado Esperado
Valor opcional desestruturado com a sintaxe if let.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_2_SeuNome - Envie na tarefa:
Atividade Cap 10 - Enums, Option, Result e Pattern Matching
🔑 Gabarito de Código & Solução Comentada
// option_if_let.rs
fn obter_ip() -> Option<&'static str> {
Some("192.168.1.1")
}
fn main() {
if let Some(ip) = obter_ip() {
println!("IP conectado: {}", ip);
}
}
⚡ Nível 3: Integração
Problema 10.3 — Tratamento de Erros com Result<T, E> e Operador de Propagação ?
Contexto: Tratamento de Erros com Result<T, E> e Operador de Propagação ? no contexto de Enums, Option, Result e Pattern Matching.
Requisitos de Execução:
- Criar função de divisão segura retornando
Result<f64, &'static str>e propagar erros com?.
Resultado Esperado
Erros tratados e propagados com operador de ponto de interrogação.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_3_SeuNome - Envie na tarefa:
Atividade Cap 10 - Enums, Option, Result e Pattern Matching
🔑 Gabarito de Código & Solução Comentada
// result_operator.rs
fn dividir(a: f64, b: f64) -> Result<f64, &'static str> {
if b == 0.0 { Err("Divisao por zero!") } else { Ok(a / b) }
}
fn operacao() -> Result<f64, &'static str> {
let r = dividir(100.0, 2.0)?;
Ok(r * 2.0)
}
fn main() {
match operacao() {
Ok(v) => println!("Resultado: {}", v),
Err(e) => println!("Falha: {}", e),
}
}
🏆 Nível 4: Desafio Corporativo
Problema 10.4 — Combinadores Funcionais em Option e Result (.map, .and_then, .unwrap_or)
Contexto: Combinadores Funcionais em Option e Result (.map, .and_then, .unwrap_or) no contexto de Enums, Option, Result e Pattern Matching.
Requisitos de Execução:
- Compor pipeline de transformação em
Optionutilizando.map()e.unwrap_or_default().
Resultado Esperado
Transformação funcional de Option sem blocos imperativos match.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_4_SeuNome - Envie na tarefa:
Atividade Cap 10 - Enums, Option, Result e Pattern Matching
🔑 Gabarito de Código & Solução Comentada
// option_combinators.rs
fn main() {
let texto: Option<&str> = Some("42");
let numero = texto
.and_then(|s| s.parse::<i32>().ok())
.map(|n| n * 2)
.unwrap_or(0);
println!("Numero transformado: {}", numero);
}