Rust · Intermediário · Inglês · Técnico
trait object
Valor acessado por trás de um ponteiro, como Box<dyn Trait>, cujo método é escolhido em tempo de execução por uma tabela de funções. Permite misturar tipos diferentes na mesma coleção.
Onde usar
Usado quando o conjunto de tipos não é conhecido na compilação, como em plugins. Custa uma chamada indireta e exige que o trait seja compatível com dyn.
Em código
trait Forma { fn area(&self) -> f64; }
struct Q(f64);
impl Forma for Q {
fn area(&self) -> f64 { self.0 * self.0 }
}
let v: Vec<Box<dyn Forma>> =
vec![Box::new(Q(2.0))];
println!("{}", v[0].area());Exemplos
Use a trait object to hold different shapes.
Use um trait object para guardar formas diferentes.
Box<dyn Trait> costs one extra indirection.
Box<dyn Trait> custa uma indireção a mais.
Cuidado
Não é o mesmo que genéricos: os genéricos geram código por tipo, e o trait object usa chamada dinâmica.
Sinônimos
dyn Trait, dispatch dinâmico
Antônimos
genéricos