You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Rust中数组在for循环后不会像向量一样被移动?

数组与向量在for循环中的所有权差异

核心原因在于数组和向量的IntoIterator实现逻辑完全不同:

  • 数组的IntoIterator实现:对于固定大小的数组(比如[T; N]),当你直接在for循环中使用它时,Rust会自动生成一个复制元素的迭代器。如果数组里的元素(比如示例中的i32)实现了Copy trait,迭代器每次循环都会复制数组中的元素,不会转移原数组的所有权。所以循环结束后,原数组list依然完整,能正常访问。

  • 向量的IntoIterator实现:向量Vec<T>的默认IntoIterator实现会转移整个向量的所有权,迭代器会逐个取出向量中的元素,循环结束后原向量会被彻底消耗,无法再访问。因此如果想要保留向量的所有权,必须使用引用(&vec或&mut vec),此时迭代器产生的是元素的引用,不会触动原向量的所有权。

举个对比的例子,用不实现Copy的类型作为数组元素,情况就和向量一致了:

#[derive(Debug)]
struct NoCopy; // 未实现Copy的结构体

fn main() {
    let list = [NoCopy, NoCopy];
    for item in list { // 报错:NoCopy未实现Copy,数组的IntoIterator尝试转移所有权
        println!("{:?}", item);
    }
    println!("{:#?}", list); // 原数组所有权已转移,无法访问
}

如果给NoCopy实现Copy,代码就能正常运行,原数组也能继续使用:

#[derive(Debug, Copy, Clone)]
struct NoCopy;

fn main() {
    let list = [NoCopy, NoCopy];
    for item in list {
        println!("{:?}", item);
    }
    println!("{:#?}", list); // 正常输出
}

总结:

  • 当数组元素实现Copy时,直接在for循环中使用数组,迭代器会复制元素,原数组不受影响。
  • 向量的IntoIterator默认转移所有权,因此需要用引用来保留原向量的使用权。

内容的提问来源于stack exchange,提问作者KapJ1coH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:22:16