Rust 闭包内有%operator时出错

Rust 闭包内有%operator时出错,rust,Rust,此代码 let vec = vec![1, 3, 4, 5, 6]; for i in vec.iter().filter(|x| x % 2 == 0) { println!("{}", i); } 产生错误 :4:36:4:37错误:二进制操作“%”无法应用于类型“&&&&&`[E0369] :4表示向量中的i.iter().filter(|x | x%2==0){ ^ 我无法理解此错误的含义。这与编译器如何创建匿名闭包结构有关吗 下面的代码似乎正在运行 for i in vec

此代码

let vec = vec![1, 3, 4, 5, 6];
for i in vec.iter().filter(|x| x % 2 == 0) {
    println!("{}", i);
}
产生错误

:4:36:4:37错误:二进制操作“%”无法应用于类型“&&&&&`[E0369]
:4表示向量中的i.iter().filter(|x | x%2==0){
^
我无法理解此错误的含义。这与编译器如何创建匿名闭包结构有关吗

下面的代码似乎正在运行

for i in vec.iter().filter(|&x| x % 2 == 0) {

不,它与闭包结构的创建方式无关,它是一个简单的类型错误

vec.iter()
,当
vec:vec
返回一个迭代器,该迭代器生成对其元素的引用。
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)