什么时候closures实现Fn,FnMut和FnOnce?

closures实施FnFnMutFnOnce特性的具体条件是什么?

那是:

  • 什么时候closures没有实现FnOnce特质?
  • 什么时候closures没有实现FnMut特性?
  • 什么时候closures执行Fn特质?

例如,改变其正文的封闭状态,使得编译器不能在其上实现Fn

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

  • FnOnceself )是可以被调用一次的函数,
  • FnMut&mut self )是可以调用的函数,如果它们具有&mut的环境访问权限
  • Fn&self )是一些function,如果他们只能访问他们的环境,他们仍然可以被调用。

closures|...| ... |...| ...将尽可能多地自动执行。

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

这些限制直接来自于self的types和closures结构的“解除”(见“ 在锈寻找封闭”中所描述的)。

有关2017年Rust中closures的信息,请参阅Rust书中的“闭包”一章