看看像 skip_while
和 take_while
这样的谓词,它们是
skip_while<P>(self, predicate P) -> ...
where Self: Sized, P: FnMut(&Self::Item) -> bool;
如果谓词只是返回 true 或 false,而不修改值,为什么它必须是 FnMut
而不是 Fn
(例如 Fn( &Self::Item) -> bool
)?
最佳答案
FnMut
中的 Mut
表示谓词可以具有可变状态。它没有提及参数。
此外,FnMut
是 Fn
的 super 特征,因此您还可以传递 Fn
其中 FnMut
> 已接受。
作为一个愚蠢的示例,考虑这个存储状态的闭包(因此是 FnMut
,但不是 Fn
),但无法修改迭代器中的元素:
fn main() {
let v = vec![1, 2, 3, 4, 0, 5, 6, 7];
println!("{:?}", v.iter().skip_while(|&&v| v != 0).collect::<Vec<_>>());
let mut state = false;
let one_after_zero = |&&v: &&u32| {
if state {
false
} else if v == 0 {
state = true;
true
} else {
true
}
};
println!("{:?}", v.iter().skip_while(one_after_zero).collect::<Vec<_>>());
}
( Permalink to the playground )
输出:
[0, 5, 6, 7]
[5, 6, 7]
关于rust - 为什么 Rust 迭代器的谓词是 FnMut 而不是 Fn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58465458/