Deref & Deref Coercion
Deref mapeia ponteiros inteligentes para referências internas. Deref coercion converte &T para &U quando T: Deref<Target=U> em locais de chamada.
Receita
use std::ops::Deref;
struct MyString(String);
impl Deref for MyString {
type Target = str;
fn deref(&self) -> &str { &self.0 }
}
fn print_len(s: &str) { println!("{}", s.len()); }
fn main() {
let s = MyString("hello".into());
print_len(&s); // coerção &MyString -> &str
}Quando usar isso: Wrappers Newtype e ponteiros inteligentes agindo como o tipo interno.
Exemplo de Trabalho
fn main() {
let s = String::from("rust");
let len = str_len(&s);
println!("{len}");
}
fn str_len(s: &str) -> usize { s.len() }O que isso demonstra:
&Stringé coerido para&strviaDerefBox<T>,Rc<T>similarmente coerem quandoT: Deref- Automático em argumentos de função
Análise Detalhada
A cadeia de Deref coercion é limitada para evitar recursão infinita. DerefMut para coerção mutável.
Armadilhas
- Deref retornando lifetime incorreto - Erros de compilação. Correção: Corresponder ao lifetime do campo interno.
- Over-Deref em API - Alocações ocultas se
Derefclona. Correção: ImplementarDerefapenas para referência interna. - Abuso de polimorfismo Deref - Não é herança. Correção: Preferir traits para compartilhamento de comportamento.
- Coerção ambígua - Múltiplos caminhos Deref são raros.
*manual para dereferenciar -*boxpara dereferenciar explicitamente.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Trait AsRef | Intenção explícita de conversão | Ergonomia Deref desejada |
Método .as_str() | Conversão clara | Mágica de coerção ok |
Trait Borrow | Chaves de Hash map | Coerção geral de parâmetros |
FAQs
String para str?
Exemplo clássico de coerção.Vec para slice?
&Vec<T> -> &[T].Box?
&Box<T> -> &T se T: ?.múltiplos deref?
Cadeia limitada.DerefMut?
Coerção mutável de Box para mutável interno.coerção unsized?
Parte das histórias de DST.ponteiro inteligente customizado?
Implementar Deref + Drop.pin deref?
Pin projeta para o interno.lint?
evitar deref em alguns guias de estilo - raro.vs AsRef?
AsRef chamada de método explícita.Relacionados
Versões da Stack: 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+.