小编典典

闭包何时实现 Fn、FnMut 和 FnOnce?

all

闭包实现,和特征的 具体条件是什么?Fn``FnMut``FnOnce

那是:

  • 闭包何时不 实现FnOnce特征?
  • 闭包何时不 实现FnMut特征?
  • 闭包何时不 实现Fn特征?

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


阅读 59

收藏
2022-08-19

共1个答案

小编典典

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

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

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

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

这些限制直接来自self闭包的类型和“去糖”到结构中;在我的博文 Finding Closure in
Rust
中进行了描述。

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

2022-08-19