将一组借用值的向量收集到一个带有借用特性的向量中。

3

能否从实现了 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);
1个回答

7
为了将一个结构体的迭代器收集到一个由该结构体实现的trait的向量中,可以使用迭代器的map方法将借用的结构体转换为一个借用的trait。
let dogs = [Dog, Dog];
let v: Vec<&dyn Animal> = dogs.iter().map(|a| a as &dyn Animal ).collect();

查看此游乐场以获取更多信息。


2
由于您在 v 的类型中指定了 trait,因此您还可以执行 .map(|a| a as _) 并让编译器发挥其魔力。 - rodrigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接