这段代码
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)
归档时间: |
|
查看次数: |
80 次 |
最近记录: |