首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代器是否返回对条目的引用或锈蚀中项的值?

迭代器是否返回对条目的引用或锈蚀中项的值?
EN

Stack Overflow用户
提问于 2020-03-20 19:19:41
回答 1查看 3.4K关注 0票数 8

如果我有一个向量:

代码语言:javascript
复制
let mut v = vec![0, 1, 2, 3, 4, 5];

我重复了一遍:

代码语言:javascript
复制
for &item in v.iter() {}

这里的&item是引用还是值?它似乎是来自&部分的一个参考,但阅读细节似乎表明它是一个值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-20 19:56:50

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

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

代码语言:javascript
复制
type Item = &'a T

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

在符号中

代码语言:javascript
复制
for &item in v.iter() {}

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

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

代码语言:javascript
复制
for item in v {}

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

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

代码语言:javascript
复制
for &item in &v {}

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60780389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档