Traits Padrão Comuns
Traits da biblioteca padrão aparecem em todos os lugares. Conheça Debug, Display, Clone, Copy, Eq, Ord, Hash, Default, From/Into e Deref.
Receita
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
struct UserId(u64);
fn main() {
let mut m = HashMap::new();
m.insert(UserId(1), "Ada");
let id: UserId = 2u64.into();
println!("{:?} {}", UserId::default(), id.0);
}Quando usar isso: Chaves de coleções, logging, conversões e ergonomia de ponteiros inteligentes.
Exemplo de Trabalho
#[derive(Debug, Default, PartialEq)]
struct Config { timeout_ms: u64, retries: u32 }
impl From<u64> for Config {
fn from(timeout_ms: u64) -> Self {
Self { timeout_ms, ..Default::default() }
}
}
fn main() {
let c: Config = 5000.into();
assert_eq!(c.timeout_ms, 5000);
}O que isso demonstra:
Default+Frompara construção ergonômicaIntoautomático a partir deFromPartialEqpara testesDebugpara diagnósticos
Mergulho Profundo
| Trait | Papel |
|---|---|
From/Into | Conversões de tipo |
AsRef/AsMut | Visualizações de referência baratas |
Borrow/BorrowMut | Empréstimo de chaves de hash map |
ToOwned | Clonar para o correspondente possuído |
Deref/DerefMut | Coerção de ponteiro inteligente |
Armadilhas
- Derivar
Ordem floats - Não é total. Correção: Wrapper ou centavos inteiros. HashsemEq- Emparelhamento de derivação. Correção: Ambos juntos para mapas.Displaynão pode ser derivado - Implementação manual necessária. Correção: UseDebugou escrevafmt.Defaultsentinela incorreto - Valores zero enganosos. Correção: Construtornew()em vez disso.Fromsobreposto - Apenas umFrom<T>por tipo. Correção: Newtype para fontes ambíguas.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Função construtora | Default enganoso | Default é zero natural |
TryFrom | Conversão falível | From infalível |
Hash manual | Lógica de chave personalizada | Derivar funciona |
FAQs
Clone vs Copy?
Copy implícito; Clone cópia profunda explícita.Eq vs PartialEq?
Eq requer igualdade total reflexiva.Ord vs PartialOrd?
Ord ordenação total.AsRef str?
String implementa AsRefBorrow para HashMap?
Busca com &str para chaves String via Borrow.Send/Sync?
Traits automáticos para segurança de thread.Drop?
Limpeza - não pode ser derivado com Copy.Trait Iterator?
Separado da família Eq/Hash.Traits serde?
Serializar/Desserializar do crate serde.Ler catálogo de traits?
docs.rs std::prelude::rust_2024 para o conjunto atual.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+.