rust - 为什么 Rust 迭代器的谓词是 FnMut 而不是 Fn?

标签 rust iterator predicate type-signature

看看像 skip_whiletake_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 表示谓词可以具有可变状态。它没有提及参数。

此外,FnMutFn 的 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/

相关文章:

java - 迭代器和可迭代之间有什么区别以及如何使用它们?

c# - 为什么我不能在 Tuple.Create 中使用 lambda 表达式?

rust - 如何有效地处理具有不同混凝土类型的泛型类型的 rust ?

file - Rust-开放的动态作者人数

rust - 返回响应后,在后台运行长时间运行的异步函数

c++ - 迭代器错误 C2440

rust - 如何检查一个向量是否等于另一个包含 NaN 和 inf 的向量?

c++ - 从迭代器中获取 const_iterator

c# - 将两个 lambda 表达式与内部表达式结合起来

xml - Xpath,为什么两者都匹配?