No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
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 Traitpara 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
- Implementar
DiagnosticavelparaReator,EscudoeBracoMecanico - Implementar
ManutenivelparaBracoMecanico - Implementar
gerar_relatoriocom trait bounds genéricos - Implementar
todos_operacionaiscom&[&dyn Diagnosticavel] - Implementar
encontrar_mais_danificadoecontar_operacionais - Entender a blanket implementation de
Atualizavel - Implementar
integridade_mediacom 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 Traittem 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