如果我有一个向量:
let mut v = vec![0, 1, 2, 3, 4, 5];
我遍历它:
for &item in v.iter() {}
会
&item
这里是引用还是值(value)?似乎它是来自 &
的引用。部分,但阅读细节似乎表明这是一个值(value)???
最佳答案
Do iterators return a reference to items or the value of the items in Rust?
这个问题没有一般的答案。迭代器可以返回任何一个。您可以通过查找关联类型
Iterator::Item
找到项目的类型在文档中。 Vec::iter()
的文档,例如,告诉您返回类型是 std::slice::Iter
. Iter
的文档依次具有该类型实现的特征列表,以及 Iterator
trait是其中之一。如果你展开文档,你可以看到type Item = &'a T
它告诉您迭代器的项目类型返回
Vec<T>::iter()
它&T
,即您获得对向量本身的项目类型的引用。在符号
for &item in v.iter() {}
for
之后的部分是与迭代器中的项目匹配的模式。在第一次迭代中 &item
与 &0
匹配, 所以 item
变成 0
.您可以在任何 Rust 介绍中阅读有关模式匹配的更多信息。遍历向量
v
的另一种方法是写for item in v {}
这将消耗向量,因此在循环后不能再使用它。所有项目都移出向量并按值返回。这使用
IntoIterator
为 Vec<T>
实现的特征,所以在文档中查找它的项目类型!上面的第一个循环通常写成
for &item in &v {}
借
v
作为引用&Vec<i32>
,然后调用 IntoIterator
在该引用上,它将返回相同的 Iter
上面提到的类型,所以它也会产生引用。
关于loops - 迭代器是否返回对项目的引用或 Rust 中项目的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60780389/