对 &vec 与 vec.iter() 进行反向迭代

问题描述 投票:0回答:3

这是有效的,因为

Iterator
实现了
rev()
,其中
self
DoubleEndedIterator
:

let vec: Vec<i32> = Vec::new();
for x in vec.iter().rev() {
    //Do stuff
}

但是,如果我将

vec.iter().rev()
更改为
&vec.rev()
它将无法编译,因为:

no method named `rev` found for type `std::vec::Vec<i32>` in the current scope

此外:

the method `rev` exists but the following trait bounds were not satisfied: `std::vec::Vec<i32> : std::iter::Iterator`, `[i32] : std::iter::Iterator`

但是 for 循环不是隐式调用

IntoIterator
吗?
&vec
vec.iter()
被认为是惯用的 Rust 吗?

iterator rust
3个回答
26
投票

如果您只是循环遍历

Vec
,那么
&vec
是惯用的。 这是有效的,因为
&Vec<T>
实现了
IntoIterator
,这就是 for 循环所使用的。

但是,如果您想调用

Iterator
rev
等方法,则需要一个实际的
filter
(因为
Iterator
不实现
Vec
,仅实现
Iterator
)。

所以这个:

IntoIterator

相当于:

for x in &vec.rev() { ... }

即在尝试调用 
for x in (&vec.rev()).into_iter() { ... }

方法之前没有机会使用

IntoIterator
    


16
投票
Iterator

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


&

在第二种情况下,
vec.iter().rev() (vec.iter()).rev() // same

在所有方法之后绑定:


&

一般情况下,可以的话使用
&vec.rev() &(vec.rev()) // same

,但是当你需要使用

迭代器适配器方法
时,请使用&vec
iter
    


0
投票
into_iter

运算符的优先级所致。

您可以使用

括号

来使其编译。 这不会编译:

&

这将编译:

let vec: Vec<i32> = Vec::new(); for x in &vec.iter().rev() { //Do stuff }

如果引用是变量,它也有效。因为毫无疑问 
let vec: Vec<i32> = Vec::new(); for x in (&vec).iter().rev() { //Do stuff }

并不是指

&
的结果:
rev()

	
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.