🧩 Exercícios: Traits, Trait Bounds, Derives e Generics
Spec Sistemas Com Rust • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 13.1 — Definição de Trait e Implementação para Tipos Customizados
Contexto: Definição de Trait e Implementação para Tipos Customizados no contexto de Traits, Trait Bounds, Derives e Generics.
Requisitos de Execução:
- Declarar trait
Resumivelcom métodoresumo(&self) -> Stringe implementar paraArtigo.
Resultado Esperado
Trait implementada e invocada polimorficamente.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_13_1_SeuNome - Envie na tarefa:
Atividade Cap 13 - Traits, Trait Bounds, Derives e Generics
🔑 Gabarito de Código & Solução Comentada
// traits.rs
trait Resumivel {
fn resumo(&self) -> String;
}
struct Artigo { titulo: String }
impl Resumivel for Artigo {
fn resumo(&self) -> String { format!("Artigo: {}", self.titulo) }
}
fn main() {
let a = Artigo { titulo: "Rust 2026".into() };
println!("{}", a.resumo());
}
🔍 Nível 2: Prática
Problema 13.2 — Trait Bounds e Cláusula where em Funções Genéricas
Contexto: Trait Bounds e Cláusula where em Funções Genéricas no contexto de Traits, Trait Bounds, Derives e Generics.
Requisitos de Execução:
- Restringir função genérica exigindo que o tipo implemente
std::fmt::Display + PartialOrd.
Resultado Esperado
Função genérica com múltiplos trait bounds validada em tempo de compilação.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_13_2_SeuNome - Envie na tarefa:
Atividade Cap 13 - Traits, Trait Bounds, Derives e Generics
🔑 Gabarito de Código & Solução Comentada
// trait_bounds.rs
use std::fmt::Display;
fn exibir_maior<T>(a: T, b: T) where T: Display + PartialOrd {
if a > b { println!("Maior: {}", a); } else { println!("Maior: {}", b); }
}
fn main() {
exibir_maior(42, 100);
}
⚡ Nível 3: Integração
Problema 13.3 — Derivação Automática de Traits Padrão (#[derive(Debug, Clone, PartialEq)])
Contexto: Derivação Automática de Traits Padrão (#[derive(Debug, Clone, PartialEq)]) no contexto de Traits, Trait Bounds, Derives e Generics.
Requisitos de Execução:
- Derivar traits de depuração, clonagem e comparação automática em struct de domínio.
Resultado Esperado
Struct com traits derivadas pronta para logging e comparações diretas.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_13_3_SeuNome - Envie na tarefa:
Atividade Cap 13 - Traits, Trait Bounds, Derives e Generics
🔑 Gabarito de Código & Solução Comentada
// derive_traits.rs
#[derive(Debug, Clone, PartialEq)]
struct Ponto { x: i32, y: i32 }
fn main() {
let p1 = Ponto { x: 10, y: 20 };
let p2 = p1.clone();
println!("Pontos iguais: {}", p1 == p2);
println!("Debug: {:?}", p1);
}
🏆 Nível 4: Desafio Corporativo
Problema 13.4 — Despacho Estático (impl Trait) vs Despacho Dinâmico (dyn Trait)
Contexto: Despacho Estático (impl Trait) vs Despacho Dinâmico (dyn Trait) no contexto de Traits, Trait Bounds, Derives e Generics.
Requisitos de Execução:
- Demonstrar monomorfização de
impl Traitem tempo de compilação vs vetor heterogêneoVec<Box<dyn Trait>>.
Resultado Esperado
Despacho estático e dinâmico de traits operando com máxima performance.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_13_4_SeuNome - Envie na tarefa:
Atividade Cap 13 - Traits, Trait Bounds, Derives e Generics
🔑 Gabarito de Código & Solução Comentada
// dyn_traits.rs
trait Plugin { fn executar(&self); }
struct PluginA; impl Plugin for PluginA { fn executar(&self) { println!("Plugin A"); } }
fn main() {
let plugins: Vec<Box<dyn Plugin>> = vec![Box::new(PluginA)];
for p in plugins { p.executar(); }
}