此代码
let vec = vec![1, 3, 4, 5, 6];
for i in vec.iter().filter(|x| x % 2 == 0) {
println!("{}", i);
}
产生错误
<anon>:4:36: 4:37 error: binary operation `%` cannot be applied to type `&&_` [E0369]
<anon>:4 for i in vec.iter().filter(|x| x % 2 == 0) {
^
我无法理解这个错误的含义。这与编译器如何创建匿名闭包结构有关吗?
以下代码似乎正在运作。
for i in vec.iter().filter(|&x| x % 2 == 0) {
答案 0 :(得分:12)
不,它与如何创建闭包结构无关,它是一个简单的类型错误。
vec.iter()
,当vec: Vec<T>
时,返回一个迭代器,它产生对其元素的引用。 filter()
闭包也通过引用接受每个元素(因为否则会消耗元素,但这会破坏filter()
的整个目的)。因此,在vec.iter().filter(|x| ...)
中,闭包参数x
的类型为&&T
,在您的情况下为&&i32
。
Rust数字运算符不能应用于&&T
,只能应用于&T
或T
,因此您需要以某种方式取消引用闭包参数。有两种方法,首先,正如您所注意到的,您可以使用取消引用模式:
vec.iter().filter(|&x| x % 2 == 0)
// or even
vec.iter().filter(|&&x| x % 2 == 0)
解除引用模式会自动取消引用它匹配的引用:
&x: &&i32 ==> x: &i32
&&x: &&i32 ==> x: i32
或者,您可以直接取消引用该号码:
vec.iter().filter(|x| *x % 2 == 0)
// or
vec.iter().filter(|x| **x % 2 == 0)