Métodos Padrão e Supertraits
Traits podem fornecer corpos de métodos padrão e exigir supertraits (trait B: A) para que os implementadores forneçam comportamento pré-requisito.
Receita
trait Animal: std::fmt::Display {
fn name(&self) -> &str;
fn describe(&self) -> String {
format!("{} é um {}", self.name(), self)
}
}Quando usar isso: DRY para lógica de trait compartilhada e para criar camadas de traits (Display antes de um resumo personalizado).
Exemplo de Trabalho
struct Cat(&'static str);
impl std::fmt::Display for Cat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "gato")
}
}
impl Animal for Cat {
fn name(&self) -> &str { self.0 }
}
fn main() {
let c = Cat("Milo");
println!("{}", c.describe());
}O que isso demonstra:
describepadrão chamanameeDisplay- Supertrait
Displayvinculado aAnimal impl Animalmínimo quando os padrões são suficientes
Aprofundamento
Métodos padrão são herdados a menos que sejam substituídos. Supertraits compõem capacidades: hierarquias no estilo trait Iterator: IntoIterator (conceitualmente).
Armadilhas
- Implementação de supertrait ausente - Erros no local do
impl. Correção: ImplementeDisplay(etc.) primeiro. - Segurança de objeto com padrões - Algumas combinações quebram
dyn. Correção: Verifique as regras de segurança de objeto. - Recursão infinita no padrão - O padrão chama a si mesmo. Correção: Chame o método obrigatório, não o padrão de si mesmo.
- Bypass do padrão selado - Documente quem pode implementar. Correção: Supertrait privado no módulo.
- Alterações que quebram o padrão - Semver para traits públicos. Correção: Novo trait ou aumento de versão.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Funções auxiliares | Sem polimorfismo de trait | Comportamento compartilhado entre implementações de trait |
| Implementação genérica (Blanket impl) | Implementação automática para todos T: Bound | Risco de implementação conflitante |
| Trait de extensão | Adicionar a um tipo existente | Regra do órfão (Orphan rule) |
FAQs
Substituir padrões?
Forneça o método no bloco `impl`.Múltiplos supertraits?
`trait T: A + B`.Padrão usa `Self`?
Sim - outros métodos de trait no receptor.dyn Trait + padrões?
Funciona se o objeto trait for seguro.Padrões assíncronos?
Rust moderno suporta `async fn` em traits com suporte de edição.Especialização?
Instável - implementações sobrepostas não estão em Rust estável.vs padrões virtuais C++?
Intenção semelhante; traits Rust não são herança.Testar padrões?
Implemente um tipo mínimo, chame apenas o método padrão.Visibilidade padrão?
Igual ao trait - geralmente `pub` com o trait.Tipos associados obrigatórios?
Separado dos padrões - deve ser especificado na implementação.Relacionados
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.