这不起作用:
\n\nlet 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];\nRun Code Online (Sandbox Code Playgroud)\n\n错误信息:
\n\nlet 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];\nRun Code Online (Sandbox Code Playgroud)\n\n该向量已移至循环中。它的所有权 \xe2\x80\x94 及其各个元素的所有权 \xe2\x80\x94 已永久转移到那里。
\n\n但这有效:
\n\nlet largest = vectors[0];\nlet largest2 = vectors[0];\nRun Code Online (Sandbox Code Playgroud)\n\n我不知道为什么;该vectors[0]值应该被移动到largest并且largest2应该失败,但它没有。
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 次 |
| 最近记录: |