devterview_$ iniciar simulação

Traits: dispatch estático (`impl Trait`) x dinâmico (`dyn Trait`)

DifícilSêniorTraits e polimorfismo

Pergunta

O que é uma trait em Rust, e qual a diferença entre usar `impl Trait`/genéricos e `Box<dyn Trait>`?

Resposta esperada

Uma trait define comportamento compartilhado (métodos) que tipos podem implementar — é o mecanismo de polimorfismo do Rust (nem herança de classe). Dispatch estático: `fn f<T: Desenhavel>(x: T)` ou `fn f(x: impl Desenhavel)` — o compilador gera uma versão especializada da função pra cada tipo concreto usado (monomorfização). Zero custo em runtime (chamada direta, inlinável), mas infla o binário e o tipo é fixado em compile time — não dá pra ter um `Vec` de coisas de tipos diferentes. Dispatch dinâmico: `Box<dyn Desenhavel>` / `&dyn Desenhavel` — um 'fat pointer' (dados + vtable); a chamada de método passa pela vtable em runtime (pequeno custo, sem inline). Necessário quando você precisa de uma coleção heterogênea (`Vec<Box<dyn Desenhavel>>`) ou de escolher o tipo em runtime. Regra: genérico/`impl Trait` por padrão; `dyn` quando precisa de heterogeneidade ou pra cortar o tamanho do binário.

Por que perguntam isso

Pergunta sênior de Rust. Termos: 'monomorfização', 'fat pointer', 'vtable'. Sinal bom: 'genérico por padrão, dyn pra heterogeneidade'.

#traits#dyn#impl-trait#monomorfizacao
publicidade

Relacionadas