闭包什么时候实现 Fn、FnMut 和 FnOnce?

When does a closure implement Fn, FnMut and FnOnce?

闭包实现 FnFnMutFnOnce 特征的具体条件是什么?

即:

例如,改变其主体上的闭包状态会使编译器无法在其上实现 Fn

每个特征都代表了关于 closures/functions 的越来越多的限制性属性,由它们的 call_... 方法的签名指示,特别是 self 的类型:

  • FnOnce(self)是可以调用一次的函数
  • FnMut (&mut self) 是可以调用的函数,如果它们可以 &mut 访问其环境
  • Fn (&self) 是可以调用的函数,如果它们只有 & 访问其环境

闭包 |...| ... 将自动实现尽可能多的闭包。

  • 所有闭包实现FnOnce: 一个不能调用一次的闭包名不副实。请注意,如果闭包仅实现 FnOnce,则只能调用一次。
  • 不移出其捕获实现的闭包 FnMut,允许它们被多次调用(如果有对函数对象的非别名访问)。
  • 不需要 unique/mutable 访问其捕获实现的闭包 Fn,允许它们基本上在任何地方被调用。

这些限制直接来自 self 的类型和闭包的 "desugaring" 结构;在我的博客中描述 post Finding Closure in Rust.

有关闭包的信息,请参阅 Rust 编程语言 中的 Closures: Anonymous Functions that Can Capture Their Environment