这是Rust by Example的示例:

pub trait Iterator {
    // The type being iterated over.
    type Item;

    // `any` takes `&mut self` meaning the caller may be borrowed
    // and modified, but not consumed.
    fn any<F>(&mut self, f: F) -> bool where
        // `FnMut` meaning any captured variable may at most be
        // modified, not consumed. `Self::Item` states it takes
        // arguments to the closure by value.
        F: FnMut(Self::Item) -> bool {}
}

如果参数是按值取值的,那为什么还要麻烦使用FnMut,因为该参数无论如何都不能被突变?实际上,为什么在这里甚至还允许FnMut?似乎只有FnOnce is permitted to do this:

最佳答案

FnOnceFnMutFn之间的区别在于函数如何访问其环境(分别是移动,可变引用,共享引用)。它与访问函数的参数无关。

这里需要FnMut,因为any方法可能需要多次调用该函数。

有一个paragraph in the Rust book about the implementation of closures。它显示了self参数的差异,该参数本质上是包含环境的struct

09-17 16:39