这工作,因为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 次 |
最近记录: |