簡體   English   中英

如何為迭代器創建 rust 過濾謂詞?

[英]How to create a rust filter predicate for an iterator?

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&mode=debug&edition=2021&gist=caf542348c2b744abace8e7b6b30d766

我不知道為什么。 簽名是一樣的。 怎么了?

簽名不太一樣。 預期的類型是 function ,它采用&'r &S ,而您的 function 采用&'r S 一個有一個額外的間接層。

您需要一個 function 采用雙引用並使用單引用調用filter_function 我們可以通過顯式取消引用來做到這一點。

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

不過,一般來說,Rust 對 lambda 中這類解引用問題的梳理還是不錯的,所以我們可以簡單地寫

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

Rust 足夠聰明,可以為我們處理雙重參考。

值得一提的是,額外的 lambda 應該不會影響性能。 filter采用通用參數,這意味着它將被靜態分派,因此優化器很容易內聯。 所以性能應該相當於擁有一個頂級的function。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM