向量借用和所有权

Gra*_*Dot 10 rust

这不起作用:

\n\n
let vectors = vec![1, 2, 3, 4, 5, 6, 7];\n\nfor i in vectors {\n    println!("Element is {}", i);\n}\n\nlet largest = vectors[0];\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误信息:

\n\n
let vectors = vec![1, 2, 3, 4, 5, 6, 7];\n\nfor i in vectors {\n    println!("Element is {}", i);\n}\n\nlet largest = vectors[0];\n
Run Code Online (Sandbox Code Playgroud)\n\n

该向量已移至循环中。它的所有权 \xe2\x80\x94 及其各个元素的所有权 \xe2\x80\x94 已永久转移到那里。

\n\n

但这有效:

\n\n
let largest = vectors[0];\nlet largest2 = vectors[0];\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不知道为什么;该vectors[0]值应该被移动到largest并且largest2应该失败,但它没有。

\n

Frx*_*rem 10

当您在循环vectors内部使用时for..in,Rust 将调用 的IntoIterator::into_iterTrait 方法Vec,该方法获取 的所有权self。因此之后无法使用vectors

use std::iter::IntoIterator;

// these are equivalent
for i in vectors { /* ... */ }
for i in IntoIterator::into_iter(vectors) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

另一方面,索引运算符 调用 的特征方法Index::index,该方法Vec通过self引用进行获取。此外,它会自动取消引用该值,因此,如果向量内的项目实现了Copy,它们将从向量中复制出来,而不是借用(如果需要引用,则需要显式借用):

use std::ops::Index;

// these are equivalent
let x = vectors[0];
let x = *Index::index(&vectors, 0);

// these are equivalent
let x = &vectors[0];
let x = Index::index(&vectors, 0);
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

7500 次

最近记录:

5 年,10 月 前