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

时间:2016-09-29 16:01:59

标签: iterator rust

这是有效的,因为Iterator实现了rev(),其中selfDoubleEndedIterator

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`

但for循环是否隐式调用IntoIterator&vecvec.iter()是否被认为是惯用的Rust?

2 个答案:

答案 0 :(得分:12)

如果您只是循环遍历Vec,那么&vec就是惯用语。这是有效的,因为&Vec<T>实现了IntoIterator,这就是for循环使用的。

但是,如果您要调用Iteratorrevfilter方法,则需要实际的Iterator(因为Vec不会&# 39; t实施Iterator,仅IntoIterator)。

所以这个:

for x in &vec.rev() {
    ...
}

相当于:

for x in (&vec.rev()).into_iter() {
    ...
}

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

答案 1 :(得分:5)

这只是CriteriaQuery<Employee> query = criteriaBuilder.createQuery(Employee.class); Root<Employee> employee = query.from(Employee.class); query.multiselect ( criteriaBuilder.selectCase() .when(criteriaBuilder.isNull(employee.get("contract")), employee.get("creationDate")) .otherwise(employee.join("contract").get("fromDate")) ); 运算符的基本优先级。在第一种情况下,依次调用每个方法:

&

在第二种情况下,vec.iter().rev() (vec.iter()).rev() // same 在所有方法之后绑定:

&

通常,尽可能使用&vec.rev() &(vec.rev()) // same ,但是当您需要使用迭代器适配器方法时,请使用&veciter