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

时间:2015-05-11 20:49:37

标签: rust closures

关闭实施FnFnMutFnOnce特征的特定条件是什么?

那是:

  • 封闭不是何时实施FnOnce特征?
  • 封闭不是何时实施FnMut特征?
  • 封闭不是何时实施Fn特征?

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

1 个答案:

答案 0 :(得分:93)

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

  • FnOnceself)是可以调用一次的函数,
  • FnMut&mut self)是可以在&mut访问其环境的情况下调用的函数
  • Fn&self)是只有&访问其环境才能调用的函数。

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

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

这些限制直接来自self和" desugaring"的类型。封闭成结构(在Finding Closure in Rust中描述)。

有关2017年Rust关闭的信息,请参阅the Closures chapter in the Rust book