クロージャを戻り値にする関数のサンプル。

サンプル

以下では、イテレータから連続する重複値を除去している。(同じ作業はクレート itertools の関数 Itertools::dedup を使うとより簡単にできるが、このように標準の Iteratorある機能のみでも、そこそこ簡単にできる。)


fn main() {
    let inputs = vec![1, 2, 2, 3, 2];
    let outputs = inputs.iter().filter(create_dedup_filter());
    assert!(outputs.eq([1, 2, 3, 2].iter()));
}

fn create_dedup_filter<'a, T>() -> impl FnMut(&T) -> bool
where 
    T: Clone + PartialEq + 'a,
{
    let mut prev = None;
    move |x| {
        let ret = prev.as_ref() != Some(x);
        prev = Some(x.clone());
        ret
    }
}