Rust编译报错E0277:无法从Vec<B>类型迭代器构建Vec<B>类型值
报错原因
你代码中map(|x| x.a.clone())返回的每个迭代元素类型是Vec<B>,此时迭代器的Item类型为Vec<B>。当你调用collect::<Vec<B>>()时,相当于尝试将Vec<B>类型的元素存入元素类型为B的数组中,类型完全不匹配,因此触发编译错误。
你提到的Vec<T>实现FromIterator<T>的规则没有问题:只有当迭代器产出的元素类型为T时,才能被收集为Vec<T>。当前你的迭代器产出的是Vec<B>,所以最多只能默认收集为Vec<Vec<B>>,这也和报错提示中「FromIterator<Vec<B>> 未对 Vec<B> 实现」的描述完全对应。
修复方案
根据你想要的最终结果,有两种修复方式:
- 如果你需要将所有
A结构体中a字段存储的B合并为一个一维的Vec<B>,将map替换为flat_map自动展开嵌套数组即可:
let ret = va.iter().flat_map(|x| x.a.clone()).collect::<Vec<B>>();
- 如果你需要保留每个
A对应的Vec<B>的嵌套结构,直接修改collect的目标类型即可:
let ret = va.iter().map(|x| x.a.clone()).collect::<Vec<Vec<B>>>();
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

