为什么数组不像向量那样移动到 for 块之后?

Kap*_*coH 3 rust

我是这门语言的新手,目前正在阅读 Rust 的实践。我明白为什么你能够在for循环后访问向量。但是,我不明白为什么这有效:

let list = [1, 2, 3, 4, 5];
for item in list {
    println!("{}", item);
}
println!("{:#?}", list);
Run Code Online (Sandbox Code Playgroud)

如果我对向量尝试同样的操作,如果它不是 内部的引用for,它就无法工作,我明白为什么。

Sil*_*olo 10

数字数组永远不会移动。Copy如果数组的基础类型为,则数组就是Copy,这意味着,与基本数字类型一样,它们总是被复制而不是移动。它们有资格享受这种特殊待遇,因为数组只是表示其元素的连续字节块,因此如果可以逐字节复制其元素,那么整个数组也可以。另一方面,向量涉及动态分配和指针,因此盲目复制向量的字节是不安全的。

当您使用for循环时,您正在调用按值into_iter获取的类型。对于不是self的类型,这需要移动循环的目标来构造迭代器。但对于 的类型,Rust会创建数组的副本,然后使用该副本。 CopyforCopyinto_iter

正如相关文档(上面链接)所述:

[...] 创建一个消耗迭代器,即将每个值移出数组(从头到尾)的迭代器。调用此函数后,除非 T 实现Copy,否则无法使用该数组,因此会复制整个数组。

强调我的