Box<dyn Trait> doesn‘t implement the trait

Box<dyn Trait> doesn’t implement the trait

From: https://bennetthardwick.com/dont-use-boxed-trait-objects-for-struct-internals/

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![]
  };
}

猜你喜欢

转载自blog.csdn.net/jq0123/article/details/122062315
今日推荐