这是因为Iterator实现了rev(),其中self是DoubleEndedIterator
let vec: Vec<i32> = Vec::new();
for x in vec.iter().rev() {
//Do stuff
}但是,如果我将vec.iter().rev()更改为&vec.rev(),它将不会编译,因为:
没有为当前作用域中的
std::vec::Vec<i32>类型找到名为std::vec::Vec<i32>的方法
此外:
方法
rev存在,但不满足以下特征界限:std::vec::Vec<i32> : std::iter::Iterator,[i32] : std::iter::Iterator
但是for循环不隐式调用IntoIterator吗?&vec或vec.iter()被认为是惯用的锈病吗?
发布于 2016-09-29 16:06:50
如果您只是在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。
发布于 2016-09-29 16:06:41
这只是&运算符的基本优先级。在第一种情况下,依次调用每个方法:
vec.iter().rev()
(vec.iter()).rev() // same在第二种情况下,&在所有方法之后绑定:
&vec.rev()
&(vec.rev()) // same通常,在可能的时候使用&vec,但是当您需要使用迭代器适配器方法时,使用iter或into_iter。
https://stackoverflow.com/questions/39775060
复制相似问题