在 Rust 中,迭代器是否返回对项目的引用或项目的值?

Bil*_*ill 7 loops rust

如果我有一个向量:

let mut v = vec![0, 1, 2, 3, 4, 5];
Run Code Online (Sandbox Code Playgroud)

我遍历它:

for &item in v.iter() {}
Run Code Online (Sandbox Code Playgroud)

请问&item这里是一个引用或值?看起来它是&零件的参考,但阅读细节似乎表明它很有价值???

Sve*_*ach 10

在 Rust 中,迭代器是否返回对项目的引用或项目的值?

这个问题没有普遍的答案。迭代器也可以返回。您可以通过Iterator::Item在文档中查找关联类型来找到项目的类型。Vec::iter()例如,的文档告诉您返回类型是std::slice::Iter。的文档Iter反过来有一个类型实现的特征列表,Iterator特征就是其中之一。如果展开文档,可以看到

type Item = &'a T
Run Code Online (Sandbox Code Playgroud)

它告诉您迭代器的项类型由Vec<T>::iter()it返回&T,即您获得对向量本身的项类型的引用。

在符号中

for &item in v.iter() {}
Run Code Online (Sandbox Code Playgroud)

后面的部分是与迭代器中的项目匹配for模式。在第一次迭代&item中与 匹配&0,因此item变为0。您可以在任何 Rust 介绍中阅读有关模式匹配的更多信息。

迭代向量的另一种方法v是写

for item in v {}
Run Code Online (Sandbox Code Playgroud)

这将消耗向量,因此在循环后不能再使用它。所有项目都移出向量并按值返回。这使用了IntoIterator为 实现的特征Vec<T>,所以在文档中查找它以找到它的项目类型!

上面的第一个循环通常写为

for &item in &v {}
Run Code Online (Sandbox Code Playgroud)

v作为引用借用&Vec<i32>,然后调用IntoIterator该引用,它将返回与Iter上述相同的类型,因此它也会产生引用。

  • @rsalmei每当分配名称时,无论是在“let”或“match”语句中还是在传递函数参数时,都适用相同的规则:如果值的类型实现“Copy”,则复制该值,否则复制该值被感动了。在这种情况下,该值位于引用后面,因此无法移动它,并且这只适用于实现“复制”的类型。但这不一定是“原始”类型,因为您也可以为自定义类型实现“复制”。 (2认同)