关闭%运算符的错误

tez*_*tez 7 rust

这段代码

let vec = vec![1, 3, 4, 5, 6];
for i in vec.iter().filter(|x| x % 2 == 0) {
    println!("{}", i);
}
Run Code Online (Sandbox Code Playgroud)

产生错误

<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) {
                                            ^
Run Code Online (Sandbox Code Playgroud)

我无法理解这个错误的含义.这与编译器如何创建匿名闭包结构有关吗?

以下代码似乎正在运行.

for i in vec.iter().filter(|&x| x % 2 == 0) {
Run Code Online (Sandbox Code Playgroud)

Vla*_*eev 12

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

vec.iter(),when时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)
Run Code Online (Sandbox Code Playgroud)

解除引用模式会自动取消引用它匹配的引用:

&x: &&i32   ==>  x: &i32
&&x: &&i32  ==>  x: i32
Run Code Online (Sandbox Code Playgroud)

或者,您可以直接取消引用该号码:

vec.iter().filter(|x| *x % 2 == 0)
// or
vec.iter().filter(|x| **x % 2 == 0)
Run Code Online (Sandbox Code Playgroud)