Rust中如何向Vec添加非可迭代类型?以元组为例
问题场景
用户编写的代码:
let mut centroids: Vec<(f64, f64)> = Vec::new(); centroids.extend((90.0, 0.0));
运行后触发E0277错误:
error[E0277]:
({float}, {float})is not an iterator
--> src/demo.rs:103:27
|
103 | centroids.extend((-90.0, 0.0));
| ------ ^^^^^^^^^^^^({float}, {float})is not an iterator
| |
| required by a bound introduced by this call
|
= help: the traitIteratoris not implemented for({float}, {float})
= note: required for({float}, {float})to implementIntoIterator
note: required by a bound inextend
--> /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/traits/collect.rs:368:5
用户认可该错误逻辑合理,希望找到替代方案,将一系列元组等非可迭代类型存入有序结构,询问是否可使用Vec类型,或是否有更合适的集合类型。
解决方案与建议
1. 单个元组用push直接添加
如果只是添加单个元组,Vec的push方法是最直接的选择,专门用于向向量尾部追加单个元素:
let mut centroids: Vec<(f64, f64)> = Vec::new(); centroids.push((90.0, 0.0));
2. 多个元组用extend(包装成可迭代类型)
如果要一次性添加多个元组,只需把它们包装成数组、切片这类可迭代结构,再传给extend:
let mut centroids: Vec<(f64, f64)> = Vec::new(); // 数组包装多个元组 centroids.extend([(90.0, 0.0), (-90.0, 0.0), (0.0, 90.0)]); // 切片形式也可以 centroids.extend(&[(90.0, 0.0), (-90.0, 0.0)]);
3. Vec的适用性
完全适合你的场景。Vec是Rust中最常用的有序动态集合,内存布局连续,支持快速尾部添加和随机访问,能完美满足存储一系列元组、保持插入顺序的需求,动态增减元素也很方便。
4. 其他可选集合类型
如果有特殊需求,可以参考以下类型:
VecDeque:需要在头部和尾部都高效执行添加/删除操作时,比Vec更合适。ArrayVec(需引入arrayveccrate):元素数量固定且规模不大时,可在栈上存储,避免堆分配开销。LinkedList:仅在需要频繁任意位置插入/删除、且不关心随机访问性能时考虑,通常Vec或VecDeque的表现更优。
内容的提问来源于stack exchange,提问作者Luís de Sousa

