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:

  1. Declarar trait Resumivel com método resumo(&self) -> String e implementar para Artigo.

Resultado Esperado

Trait implementada e invocada polimorficamente.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_13_1_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_13_2_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_13_3_SeuNome
  2. 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:

  1. Demonstrar monomorfização de impl Trait em tempo de compilação vs vetor heterogêneo Vec<Box<dyn Trait>>.

Resultado Esperado

Despacho estático e dinâmico de traits operando com máxima performance.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_13_4_SeuNome
  2. 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(); }
}