如果我有一个向量:
let mut v = vec![0, 1, 2, 3, 4, 5];我重复了一遍:
for &item in v.iter() {}这里的&item是引用还是值?它似乎是来自&部分的一个参考,但阅读细节似乎表明它是一个值?
发布于 2020-03-20 19:56:50
迭代器是否返回对条目的引用或Rust中项的值?
这个问题没有一般的答案。迭代器也可以返回。您可以通过在文档中查找关联类型Iterator::Item来找到项的类型。例如,Vec::iter()的文档告诉您返回类型是std::slice::Iter。Iter文档相应地列出了类型实现的特征,而Iterator trait就是其中之一。如果您展开文档,您可以看到
type Item = &'a T它告诉您迭代器的项目类型由Vec<T>::iter() it &T返回,即获得对向量本身的项类型的引用。
在符号中
for &item in v.iter() {}for后的部分是与迭代器中的项匹配的模式。在第一次迭代中,&item与&0匹配,因此item变为0。您可以阅读更多关于模式匹配在任何锈蚀介绍。
迭代向量v的另一种方法是编写
for item in v {}这将消耗向量,因此不能在循环之后再使用它。所有项目都从向量中移出并按值返回。这使用了为IntoIterator实现的Vec<T>特性,所以在文档中查找它,找到它的项类型!
上面的第一个循环通常写为
for &item in &v {}它借用v作为引用&Vec<i32>,然后对该引用调用IntoIterator,这将返回上面提到的相同的Iter类型,因此它也将产生引用。
https://stackoverflow.com/questions/60780389
复制相似问题