Rust中数组与Vec调用into_iter后重复遍历为何表现不同?
数组与Vec调用into_iter()的行为差异解析
可正常运行的数组代码
fn main() { let v = [1, 2, 3, 4, 5]; for _ in v.into_iter() {} for _ in v.into_iter() {} }
无法编译的Vec代码
fn main() { let v = vec![1, 2, 3, 4, 5]; for _ in v.into_iter() {} for _ in v.into_iter() {} }
编译报错:
use of moved value:
v
差异原因
- 对于
Vec<T>,into_iter()是其自身的方法,调用时会将整个Vec的所有权转移给迭代器。第一次调用后,原变量v的所有权已被转移,后续再调用就会触发“值已被移动”的错误。 - 数组本身并没有实现
into_iter()方法,调用时实际是借助自动解引用,使用了数组切片[T]的IntoIterator实现。但由于数组是栈上固定大小的数据,且只要元素实现Copy,数组就会自动实现Copytrait。每次调用into_iter()时,数组会被复制一份,原变量v的所有权并未转移,因此可以重复调用。
内容的提问来源于stack exchange,提问作者TSK
相关产品推荐
相关产品推荐

