这是有效的,因为Iterator
实现了rev()
,其中self
是DoubleEndedIterator
:
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
? &vec
或vec.iter()
是否被认为是惯用的Rust?
答案 0 :(得分:12)
如果您只是循环遍历Vec
,那么&vec
就是惯用语。这是有效的,因为&Vec<T>
实现了IntoIterator
,这就是for循环使用的。
但是,如果您要调用Iterator
,rev
等filter
方法,则需要实际的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
,但是当您需要使用迭代器适配器方法时,请使用&vec
或iter
。