首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向迭代a &vec与vec.iter()

反向迭代a &vec与vec.iter()
EN

Stack Overflow用户
提问于 2016-09-29 16:01:58
回答 2查看 15.2K关注 0票数 21

这是因为Iterator实现了rev(),其中selfDoubleEndedIterator

代码语言:javascript
复制
let vec: Vec<i32> = Vec::new();
for x in vec.iter().rev() {
    //Do stuff
}

但是,如果我将vec.iter().rev()更改为&vec.rev(),它将不会编译,因为:

没有为当前作用域中的std::vec::Vec<i32>类型找到名为std::vec::Vec<i32>的方法

此外:

方法rev存在,但不满足以下特征界限:std::vec::Vec<i32> : std::iter::Iterator[i32] : std::iter::Iterator

但是for循环不隐式调用IntoIterator吗?&vecvec.iter()被认为是惯用的锈病吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-29 16:06:50

如果您只是在Vec上循环,那么&vec是惯用的。这是因为&Vec<T>实现了IntoIterator,这是for循环所使用的。

但是,如果要调用Iterator方法(如revfilter等),则需要一个实际的Iterator (因为Vec不实现Iterator,只有IntoIterator)。

所以这个:

代码语言:javascript
复制
for x in &vec.rev() {
    ...
}

相当于:

代码语言:javascript
复制
for x in (&vec.rev()).into_iter() {
    ...
}

也就是说,在尝试调用IntoIterator方法之前,没有机会使用Iterator

票数 22
EN

Stack Overflow用户

发布于 2016-09-29 16:06:41

这只是&运算符的基本优先级。在第一种情况下,依次调用每个方法:

代码语言:javascript
复制
vec.iter().rev()
(vec.iter()).rev() // same

在第二种情况下,&在所有方法之后绑定:

代码语言:javascript
复制
&vec.rev()
&(vec.rev()) // same

通常,在可能的时候使用&vec,但是当您需要使用迭代器适配器方法时,使用iterinto_iter

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

https://stackoverflow.com/questions/39775060

复制
相关文章

相似问题

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