rust - 将借用值的向量收集到借用特征的向量中
问题描述
Vec<&dyn Trait>
是否可以从实现的值的迭代器中收集 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]: a value of type "Vec<&dyn Animal>" cannot be built from an iterator over elements of type
&Dog`
但是,如果您使用将狗单独推入 vec(如原始问题的答案),则它可以正常工作。
let dog1: Dog = Dog;
let dog2: Dog = Dog;
let v: Vec<&dyn Animal> = Vec::new();
v.push(&dog1);
v.push(&dog2);
解决方案
为了将结构的迭代器收集到由结构实现的特征的向量中,可以使用map
迭代器的方法将借来的结构转换为借来的特征。
let dogs = [Dog, Dog];
let v: Vec<&dyn Animal> = dogs.iter().map(|a| a as &dyn Animal ).collect();
有关更多信息,请参阅此游乐场。
推荐阅读
- python-3.x - 如何比较两个 txt 文件,然后在其中一个中应用更改
- python - 从类中创建属性可以吗?
- r - RMarkdown - ggplotly 函数
- html - 为什么纸张会覆盖我的自定义 html div(联合 js)?
- snowflake-cloud-data-platform - 是否可以在存储过程中设置变量以便视图使用它?
- c++ - 如何控制无锁环形缓冲区中的读/写指针?
- php - Wordpress %postname% 永久链接破坏静态主页 (301)
- c++ - 使用 OpenGL 写入渲染缓冲区并通过单个渲染调用显示
- react-native - 在项目“:app”中找不到任务“installDebug”
- docker - 运行 docker-compose up 时出现“拨号 unix /tmp/docker.sock:连接:权限被拒绝”