मैंने एक प्रोग्राम लिखा है जिसमें trait Animal
और struct Dog
विशेषता को लागू करने और struct AnimalHouse
एक जानवर को विशेषता वस्तु Box<Animal>
के रूप में संग्रहीत करने के लिए लिखा है।एक विशेषता वस्तु भंडारण एक संरचना क्लोन कैसे करें?
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();
}
यह पूरी तरह से काम करता है और "बॉबी: रफ, रफ!" देता है जैसा सोचा था।
लेकिन अगर मैं house
क्लोन करने के लिए कोशिश संकलक त्रुटियों
fn main(){
let house = AnimalHouse{animal: Box::new(Dog::new("Bobby"))};
let house2 = house.clone()
house2.animal.speak();
}
32:31 error: type `AnimalHouse` does not implement any method in scope named `clone` let house2 = house.clone(); ^~~~~~~ 32:31 help: methods from traits can only be called if the trait is implemented and in scope; the following trait defines a method `clone`, perhaps you need to implement it: 32:31 help: candidate #1: `core::clone::Clone` error: aborting due to previous error
मैं struct AnimalHouse
से पहले #[derive(Clone)]
जोड़ने की कोशिश की रिटर्न और एक अन्य त्रुटियों मिला:
24:24 error: the trait `core::marker::Sized` is not implemented for the type `Animal` [E0277] animal: Box ^~~~~~~~~~~~~~~~~~~ 22:15 note: in expansion of #[derive_Clone] 22:15 note: expansion site 24:24 note: `Animal` does not have a constant size known at compile-time animal: Box ^~~~~~~~~~~~~~~~~~~ 22:15 note: in expansion of #[derive_Clone] 22:15 note: expansion site 24:24 error: the trait `core::clone::Clone` is not implemented for the type `Animal` [E0277] animal: Box ^~~~~~~~~~~~~~~~~~~ 22:15 note: in expansion of #[derive_Clone] 22:15 note: expansion site error: aborting due to 2 previous errors
तो कैसे struct बनाने के लिए Animal House
क्लोनेबल? क्या जंग के लिए सक्रिय रूप से (आमतौर पर) उपयोग करने के लिए जंग का सामान्य तरीका है?
विशेषता पर एक विधि के रूप में 'clone_box' डालने की बजाय अक्षम है, सभी कार्यान्वयनकर्ताओं को इसे उसी तरह लागू करने की आवश्यकता है। एक बेहतर समाधान यह है कि 'टी: पशु + क्लोन 'के लिए कंबल कार्यान्वयन के साथ' पशु 'की एक सुपरर्ट्रेट के रूप में। * यह * एनीमैप जैसी चीजों में उपयोग किया जाने वाला दृष्टिकोण है। –
@ क्रिस मॉर्गन: अच्छा विचार; बदला हुआ। –