No description
Find a file
2026-09-01 13:37:06 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-09-01 13:37:06 +02:00
src initial content 2026-09-01 13:37:04 +02:00
tests initial content 2026-09-01 13:37:04 +02:00
.gitignore Initial commit 2026-09-01 11:36:46 +00:00
Cargo.lock initial content 2026-09-01 13:37:04 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-09-01 13:37:06 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-09-01 13:37:06 +02:00
README.md fix: content audit corrections (accuracy, coherence, concordância, tests) 2026-09-01 13:37:06 +02:00

Lição 29: Comportamentos Compartilhados (Traits)

1. Narrativa

Na Academia Æther, todo componente do mecha segue interfaces padronizadas — protocolos que garantem que qualquer peça fabricada funcione no encaixe universal. Traits são esses contratos: definem comportamentos que tipos diferentes podem implementar, permitindo polimorfismo seguro sem herança.

2. Conceito

Traits definem comportamentos compartilhados entre tipos:

  • Definição: trait Nome { fn metodo(&self) -> Tipo; } — contrato
  • Implementação: impl Trait for Tipo — cumprir o contrato
  • Métodos padrão: Implementação default que pode ser sobrescrita
  • Trait bounds: fn func<T: Trait>(x: &T) — aceitar qualquer tipo que implementa o trait
  • dyn Trait: &dyn Trait — despacho dinâmico para tipos heterogêneos
  • Blanket impl: impl<T: TraitA> TraitB for T {} — implementação automática

3. Requisitos

  • Definir e implementar traits para structs de componentes
  • Usar métodos padrão em traits
  • Aplicar trait bounds em funções genéricas
  • Trabalhar com dyn Trait para coleções heterogêneas
  • Implementar blanket implementations

4. Design de Dados

graph TD
    A[trait Diagnosticavel] --> B[Reator impl Diagnosticavel]
    A --> C[Escudo impl Diagnosticavel]
    A --> D[BracoMecanico impl Diagnosticavel]
    E[trait Manutenivel] --> D
    F[trait Atualizavel] --> G["blanket: impl<T: Diagnosticavel> Atualizavel for T"]
    A --> G

5. Diagrama de Fluxo

flowchart TD
    A[Início] --> B[Definir trait Diagnosticavel]
    B --> C[Implementar para Reator]
    B --> D[Implementar para Escudo]
    B --> E[Implementar para BracoMecanico]
    E --> F[Implementar Manutenivel]
    C --> G[Usar trait bounds em funções]
    D --> G
    F --> G
    G --> H[gerar_relatorio<T: Diagnosticavel>]
    H --> I[Usar dyn Trait para lista heterogênea]
    I --> J[Blanket impl Atualizavel]

6. Funções

Função Descrição
Diagnosticavel::nome Retorna nome do componente
Diagnosticavel::integridade Retorna integridade (0-100)
Diagnosticavel::operacional Verifica se integridade > 0 (default)
Manutenivel::precisa_manutencao Default: integridade < 50
Manutenivel::efetuar_manutencao Repara componente
gerar_relatorio Relatório para qualquer Diagnosticavel
todos_operacionais Verifica se todos estão operacionais
encontrar_mais_danificado Encontra menor integridade via dyn
contar_operacionais Conta operacionais via dyn
Atualizavel::codigo_status Blanket: status automático
integridade_media Média de componentes atualizáveis

7. Exemplo

impl Diagnosticavel for Reator {
    fn nome(&self) -> &str { &self.designation }
    fn integridade(&self) -> u32 { self.integridade_valor }
}
let reator = Reator { designation: "RX-7".into(), potencia: 900, integridade_valor: 85 };
let relatorio = gerar_relatorio(&reator);
// "Componente: RX-7 | Integridade: 85% | Status: operacional"

8. Missão

  1. Implementar Diagnosticavel para Reator, Escudo e BracoMecanico
  2. Implementar Manutenivel para BracoMecanico
  3. Implementar gerar_relatorio com trait bounds genéricos
  4. Implementar todos_operacionais com &[&dyn Diagnosticavel]
  5. Implementar encontrar_mais_danificado e contar_operacionais
  6. Entender a blanket implementation de Atualizavel
  7. Implementar integridade_media com bounds compostos

9. Como Executar

cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check

10. Dicas

  • Traits são como interfaces — definem O QUE um tipo deve fazer, não COMO
  • Métodos padrão podem ser sobrescritos com implementação específica
  • dyn Trait tem custo de indireção (vtable) — prefira trait bounds estáticos quando possível
  • Blanket implementations são poderosas: todo tipo que implementa A automaticamente ganha B