I wrote a program with the tag Animal and struct Dog that implements this trait. It also has an AnimalHouse structure that stores the animal as a Box<Animal> object.
trait Animal { fn speak(&self); } struct Dog { name: String, } impl Dog { fn new(name: &str) -> Dog { return Dog { name: name.to_string(), }; } } impl Animal for Dog { fn speak(&self) { println!{"{}: ruff, ruff!", self.name}; } } struct AnimalHouse { animal: Box<Animal>, } fn main() { let house = AnimalHouse { animal: Box::new(Dog::new("Bobby")), }; house.animal.speak(); }
He returns "Bobby: ruff, ruff!" as expected, but if I try to clone house , the compiler returns errors:
fn main() { let house = AnimalHouse { animal: Box::new(Dog::new("Bobby")), }; let house2 = house.clone(); house2.animal.speak(); }
error[E0599]: no method named `clone` found for type `AnimalHouse` in the current scope --> src/main.rs:31:24 | 23 | struct AnimalHouse { | ------------------ method `clone` not found for this ... 31 | let house2 = house.clone(); | ^^^^^ | = help: items from traits can only be used if the trait is implemented and in scope = note: the following trait defines an item `clone`, perhaps you need to implement it: candidate #1: `std::clone::Clone`
I tried adding #[derive(Clone)] to struct AnimalHouse and got another error:
error[E0277]: the trait bound `Animal: std::clone::Clone` is not satisfied --> src/main.rs:25:5 | 25 | animal: Box<Animal>, | ^^^^^^^^^^^^^^^^^^^ the trait `std::clone::Clone` is not implemented for `Animal` | = note: required because of the requirements on the impl of `std::clone::Clone` for `std::boxed::Box<Animal>` = note: required by `std::clone::Clone::clone`
How to make struct AnimalHouse cloneable? Is idiomatic rust actively using an object-sign? At all?
source share