这工作,因为Iterator工具rev(),其中self是DoubleEndedIterator:
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()它不会因为编译:
Run Code Online (Sandbox Code Playgroud)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`
但是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方法之前没有机会使用.
这只是&运营商的基本优先顺序.在第一种情况下,依次调用每个方法:
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尽可能使用,但是当您需要使用迭代器适配器方法时,请使用iter或into_iter.
| 归档时间: |
|
| 查看次数: |
3821 次 |
| 最近记录: |