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

HiD*_*der 9 iterator rust

这工作,因为Iterator工具rev(),其中selfDoubleEndedIterator:

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

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

no method named `rev` found for type `std::vec::Vec<i32>` in the current scope
Run Code Online (Sandbox Code Playgroud)

此外:

the method `rev` exists but the following trait bounds were not satisfied: `std::vec::Vec<i32> : std::iter::Iterator`, `[i32] : std::iter::Iterator`
Run Code Online (Sandbox Code Playgroud)

但是for循环不会隐式调用IntoIterator吗?是&vec或被vec.iter()认为是惯用的Rust?

Chr*_*son 13

如果你只是循环Vec,那么&vec就是惯用语.这是因为&Vec<T>实现IntoIterator,这是for循环使用的.

但是,如果你要调用Iterator的方法,例如rev,filter等等,你需要一个实际的Iterator(因为Vec没有实现Iterator,只IntoIterator).

所以这:

for x in &vec.rev() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

相当于:

for x in (&vec.rev()).into_iter() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

IntoIterator在尝试调用Iterator方法之前没有机会使用.


She*_*ter 8

这只是&运营商的基本优先顺序.在第一种情况下,依次调用每个方法:

vec.iter().rev()
(vec.iter()).rev() // same
Run Code Online (Sandbox Code Playgroud)

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

&vec.rev()
&(vec.rev()) // same
Run Code Online (Sandbox Code Playgroud)

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