能否从实现了 Trait
的值的迭代器中收集一个 Vec<&dyn Trait>
?
这里有一个基于 Vector of objects belonging to a trait 问题的示例:
trait Animal {
fn make_sound(&self) -> String;
}
struct Dog;
impl Animal for Dog {
fn make_sound(&self) -> String {
"woof".to_string()
}
}
fn main() {
let dogs = [Dog, Dog];
let v: Vec<&dyn Animal> = dogs.iter().collect();
for animal in v.iter() {
println!("{}", animal.make_sound());
}
}
这会导致错误:error[E0277]: 无法从类型为“Vec<&dyn Animal>”的值中构建类型为
&Dog的元素的迭代器。
然而,如果你按照原问题的答案将每只狗单独加入到向量中,就不会出现任何问题。
let dog1: Dog = Dog;
let dog2: Dog = Dog;
let v: Vec<&dyn Animal> = Vec::new();
v.push(&dog1);
v.push(&dog2);
v
的类型中指定了 trait,因此您还可以执行.map(|a| a as _)
并让编译器发挥其魔力。 - rodrigo