如何为迭代器创建一个rust过滤器谓词?


pub struct S{
a: u32
}
fn main() {
let ve = vec![S{a: 1}, S{a: 2}];
ve.iter().filter(filter_function);
}
fn filter_function(s: &S) -> bool {
todo!()
}

error[E0631]: type mismatch in function arguments
--> src/main.rs:6:22
|
6   |     ve.iter().filter(filter_function);
|               ------ ^^^^^^^^^^^^^^^ expected signature of `for<'r> fn(&'r &S) -> _`
|               |
|               required by a bound introduced by this call
...
9   | fn filter_function(s: &S) -> bool {
| --------------------------------- found signature of `for<'r> fn(&'r S) -> _`
|
note: required by a bound in `filter`

https://play.rust-lang.org/?version=stable&模式= debug&版= 2021,要点= caf542348c2b744abace8e7b6b30d766

我不知道为什么。签名是一样的。怎么了?

签名并不完全相同。期望的类型是一个取&'r &S的函数,而你的函数取&'r S。一个有额外的间接层。

需要一个接受双引用的函数,并使用单引用调用filter_function。可以通过显式解引用来实现。

ve.iter().filter(|x| filter_function(*x));

然而,一般来说,Rust很擅长在lambdas中解决这类解引用问题,所以我们可以简单地写

ve.iter().filter(|x| filter_function(x));

和Rust足够聪明,可以为我们处理双引用。

值得一提的是,额外的lambda不应该对性能造成影响。filter接受一个泛型参数,这意味着它将被静态分派,因此优化器将很容易内联。因此,性能应该等同于拥有一个顶级函数。

相关内容

  • 没有找到相关文章

最新更新