什么时候closures实现Fn,FnMut和FnOnce?
closures实施Fn
, FnMut
和FnOnce
特性的具体条件是什么?
那是:
- 什么时候closures没有实现
FnOnce
特质? - 什么时候closures没有实现
FnMut
特性? - 什么时候closures不执行
Fn
特质?
例如,改变其正文的封闭状态,使得编译器不能在其上实现Fn
。
每个特征代表越来越多的关于闭包/function的限制性属性,由它们的call_...
方法的签名来表示,特别是self
的types:
-
FnOnce
(self
)是可以被调用一次的函数, -
FnMut
(&mut self
)是可以调用的函数,如果它们具有&mut
的环境访问权限 -
Fn
(&self
)是一些function,如果他们只能访问他们的环境,他们仍然可以被调用。
closures|...| ...
|...| ...
将尽可能多地自动执行。
- 所有的closures实现
FnOnce
:一个不能被调用的closures不值得名称。 请注意,如果闭包仅实现FnOnce
,则只能调用一次。 - 不移出捕获的闭包实现
FnMut
,允许它们被多次调用(如果对函数对象没有任何访问权限)。 - 不需要唯一/可变的访问权限的闭包实现
Fn
,允许它们基本上在任何地方被调用。
这些限制直接来自于self
的types和closures结构的“解除”(见“ 在锈中寻找封闭”中所描述的)。
有关2017年Rust中closures的信息,请参阅Rust书中的“闭包”一章 。