封闭式

时间:2015-07-07 05:44:02

标签: rust

此代码

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) {

1 个答案:

答案 0 :(得分:12)

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

vec.iter(),当vec: Vec<T>时,返回一个迭代器,它产生对其元素的引用。 filter()闭包也通过引用接受每个元素(因为否则会消耗元素,但这会破坏filter()的整个目的)。因此,在vec.iter().filter(|x| ...)中,闭包参数x的类型为&&T,在您的情况下为&&i32

Rust数字运算符不能应用于&&T,只能应用于&TT,因此您需要以某种方式取消引用闭包参数。有两种方法,首先,正如您所注意到的,您可以使用取消引用模式:

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)