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);