什么时候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书中的“闭包”一章 。