У меня есть две Структуры, Dog
и Cat
:понижающее приведение ржавчины Комбинации Trait
struct Dog {
weight: f64
}
struct Cat {
weight: f64
}
и две черты MakesSound
и HasWeight
trait MakesSound {
fn make_sound(&self);
}
impl MakesSound for Dog {
fn make_sound(&self) {
println!("Bark bark!");
}
}
impl MakesSound for Cat {
fn make_sound(&self) {
println!("Go away.");
}
}
trait HasWeight {
fn get_weight(&self) -> f64;
}
impl HasWeight for Dog {
fn get_weight(&self) -> f64 { self.weight }
}
impl HasWeight for Cat {
fn get_weight(&self) -> f64 { self.weight }
}
Я хотел бы иметь возможность хранить их в гетерогенной Vec
и затем используйте оба их черты
trait Animal: MakesSound + HasWeight {}
impl<T: MakesSound + HasWeight> Animal for T {}
fn main() {
let dog = Dog{ weight: 45.0 };
let cat = Cat{ weight: 12.0 };
let animals: Vec<&Animal> = vec![&dog, &cat];
for animal in animals {
animal.make_sound();
println!("{}", animal.get_weight());
//print_weight(animal as &HasWeight);
}
}
Как бы определить print_weight
функции, которая имела тип
fn print_weight(x: &HasWeight);
так, что моя функция будет требовать как мало информации, насколько это возможно, но мой Vec
хранит столько информации, сколько возможно?
Я получаю ошибку от раскомментирован линии выше
error: non-scalar cast: `&Animal` as `&HasWeight`
https://stackoverflow.com/questions/28632968/why-doesnt-rust-support-trait-object-upcasting –