反向迭代一个&vec和vec.iter()的区别

25
这段代码之所以有效,是因为Iterator实现了rev()方法,其中selfDoubleEndedIterator类型。
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 呢?&vecvec.iter() 被认为是 Rust 中的惯用语吗?
2个回答

26
如果只是循环遍历Vec,那么使用&vec是惯用语。这是因为&Vec<T>实现了IntoIterator,这是for循环使用的内容。
但是,如果您想调用Iterator方法,例如revfilter等,则需要一个实际的Iterator(因为Vec没有实现Iterator,只有IntoIterator)。
因此,这样做:
for x in &vec.rev() {
    ...
}

等同于:

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

换句话说,在尝试调用Iterator方法之前,没有机会使用IntoIterator


16

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

vec.iter().rev()
(vec.iter()).rev() // same
在第二种情况下,& 绑定在所有方法之后。
&vec.rev()
&(vec.rev()) // same

通常情况下,使用&vec,但如果需要使用迭代器适配器方法,则使用iterinto_iter


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接