クロージャを戻り値にする関数のサンプル。
以下では、イテレータから連続する重複値を除去している。(同じ作業はクレート 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
}
}