为什么通过 `for` 循环迭代集合被认为是 Rust 中的“移动”?

Jus*_*ner 7 move rust borrowing

我有以下 Rust 程序。

fn main() {
    let v = vec![100, 32, 57];
    for i in v {
        println!("{}", i);
    }

    println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到:

fn main() {
    let v = vec![100, 32, 57];
    for i in v {
        println!("{}", i);
    }

    println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)

该错误指出在 处发生了移动for i in v。但我只是使用vlet v = vec![100, 32, 57]. 它不是像 那样的东西let v2 = v; for i in v2 ...,它将值从v移到v2。谁能帮忙解释一下?

Ry-*_*Ry- 14

正如https://doc.rust-lang.org/reference/expressions/loop-expr.html#iterator-loops所说,

for表达是遍历通过的实施方案提供元件语法构造std::iter::IntoIterator

Vec implementsIntoIterator,允许您Vec通过使用它来拥有实例的元素:

创建一个消耗迭代器,即将每个值移出向量(从开始到结束)。调用此向量后,将无法使用该向量。

(如错误消息所述,解决此问题的方法是循环&v而不是v,借用其元素而不是拥有它们。您可以循环for &i in &v来维护 的类型i。)

对于您来说,拥有 的元素在高层次上似乎没有必要v,因为它们是可复制的,但是没有允许在此处使用该信息的特殊实现。IntoIterator.into_iter()take self,这意味着 for 循环总是消耗被迭代的值。