Rust 媒介借用与所有权

Rust 媒介借用与所有权,rust,Rust,这不起作用: let vectors = vec![1, 2, 3, 4, 5, 6, 7]; for i in vectors { println!("Element is {}", i); } let largest = vectors[0]; 错误消息: 错误[E0382]:移动值的借用:`vectors` -->src/main.rs:8:19 | 2 |让向量=向量![1, 2, 3, 4, 5, 6, 7]; |----发生移动是因为'vectors'具有'std::v

这不起作用:

let vectors = vec![1, 2, 3, 4, 5, 6, 7];

for i in vectors {
    println!("Element is {}", i);
}

let largest = vectors[0];
错误消息:

错误[E0382]:移动值的借用:`vectors`
-->src/main.rs:8:19
|
2 |让向量=向量![1, 2, 3, 4, 5, 6, 7];
|----发生移动是因为'vectors'具有'std::vec::vec'类型,该类型不实现'Copy'特性
3 | 
4 |对于向量中的i{
|              -------
|              |
|价值转移到这里
帮助:考虑借用避免进入for循环:“和向量”
...
8 |设最大=向量[0];
|^^^^^^^^移动后在此借用的值
向量已经被移动到循环中,它的所有权——以及它的单个元素的所有权——已经永久地转移到了那里

但这是可行的:

let largest = vectors[0];
let largest2 = vectors[0];
我不知道为什么;
向量[0]
值应该移动到
最大值,然后
最大值2
应该失败,但它没有失败。

值的类型(可能是
i32
)在
Vec
中实现
Copy
特性,这意味着在为向量编制索引时它们不会被移出,而是被复制

此类
Copy
类型的
Vec
本身仍然无法实现
Copy
,因此它会被移动到循环中。您可以通过编写

for i in vectors.iter() {
    println!("Element is {}", *i);
}

取消引用(
*
)与原始代码示例中一样,为您提供一个拥有的值。
println!
不需要该值,但其他用途可能需要该值。

当您在
中使用
向量时,在
循环中,Rust将调用
向量的trait方法,该方法拥有
自身的所有权。因此,您可以以后不能使用
向量

使用std::iter::IntoIterator;
//这些是等价的
对于向量{/*…*/}中的i
对于i,在IntoIterator::into_iter(vectors){/*…*/}
另一方面,调用
Vec
的trait方法,该方法通过引用获取
self
。此外,它会自动取消对值的引用,因此如果向量中的项实现了
Copy
,它们将从向量中复制出来,而不是借用(如果您想要参考,您需要明确借用):

使用std::ops::Index;
//这些是等价的
设x=向量[0];
设x=*Index::Index(&vectors,0);
//这些是等价的
设x=&向量[0];
设x=Index::Index(&vectors,0);