这是有效的,因为
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`
IntoIterator
吗? &vec
或 vec.iter()
被认为是惯用的 Rust 吗?
如果您只是循环遍历
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
。Iterator
运算符的基本优先级。第一种情况,依次调用每个方法:
&
在第二种情况下,
vec.iter().rev()
(vec.iter()).rev() // same
在所有方法之后绑定:
&
一般情况下,可以的话使用
&vec.rev()
&(vec.rev()) // same
,但是当你需要使用
迭代器适配器方法时,请使用
&vec
或iter
。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()