From: Don't use boxed trait objects (bennetthardwick.com)
By default a Box<dyn Trait>
doesn't implement the trait of the object it contains. This means that trying to construct PeopleZoo<Box<dyn Person>>
won't work out of the box and will give a type error.
Because of this, it's good practice to give a default implementation of your trait for it's boxed counterpart. This can be done by calling as_ref
or as_mut
on the Box
and calling the references relevant method.
For just a small bit of effort you can help a bunch of people that may consume your struct.
trait Person {
fn say_hello(&self);
}
impl Person for Box<dyn Person> {
fn say_hello(&self) {
self.as_ref().say_hello()
}
}
struct PeopleZoo<P: Person> {
people: Vec<P>,
}
fn main() {
let mut zoo: PeopleZoo<Box<dyn Person>> = PeopleZoo {
people: vec![]
};
}