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

实现 FnFnMutFnOnce特性的闭包的 具体情况是什么?

那就是:

  • 闭包 没有何时实现 FnOnce特性?
  • 闭包 没有何时实现 FnMut特性?
  • 闭包 没有何时实现 Fn特性?

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

44611 次浏览

每个特征都代表了关于闭包/函数越来越多的限制性特征,这些特征通过它们的 call_...方法的签名来表示,特别是 self的类型:

  • FnOnce (self)是可以调用一次的函数
  • FnMut (&mut self)是一些函数,如果它们具有对其环境的 &mut访问权限,就可以调用它们
  • Fn (&self)是只有 &访问其环境时才能调用的函数

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

  • 所有闭包都实现了 FnOnce: 不能调用一次的闭包不值得使用这个名称。注意,如果闭包只实现 FnOnce,那么它只能调用一次。
  • 不移出捕获范围的闭包实现了 FnMut,允许对它们进行多次调用(如果对函数对象有无别名的访问)。
  • 不需要唯一/可变访问它们的捕获的闭包实现了 Fn,允许它们基本上在任何地方被调用。

这些限制直接来自于 self的类型和闭包对结构的“去糖化”; 在我的博客文章 在锈中寻找终结中有描述。

有关闭包的信息,请参见 锈迹编程语言中的 闭包: 可以捕获其环境的匿名函数