如果我有一个向量:
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
上述相同的类型,因此它也会产生引用。
归档时间: |
|
查看次数: |
1255 次 |
最近记录: |