闭包什么时候实现 Fn、FnMut 和 FnOnce?
When does a closure implement Fn, FnMut and FnOnce?
闭包实现 Fn
、FnMut
和 FnOnce
特征的具体条件是什么?
即:
- 闭包什么时候不实现
FnOnce
特征?
- 什么时候闭包不实现
FnMut
特征?
- 什么时候闭包不实现
Fn
特征?
例如,改变其主体上的闭包状态会使编译器无法在其上实现 Fn
。
每个特征都代表了关于 closures/functions 的越来越多的限制性属性,由它们的 call_...
方法的签名指示,特别是 self
的类型:
FnOnce
(self
)是可以调用一次的函数
FnMut
(&mut self
) 是可以调用的函数,如果它们可以 &mut
访问其环境
Fn
(&self
) 是可以调用的函数,如果它们只有 &
访问其环境
闭包 |...| ...
将自动实现尽可能多的闭包。
- 所有闭包实现
FnOnce
: 一个不能调用一次的闭包名不副实。请注意,如果闭包仅实现 FnOnce
,则只能调用一次。
- 不移出其捕获实现的闭包
FnMut
,允许它们被多次调用(如果有对函数对象的非别名访问)。
- 不需要 unique/mutable 访问其捕获实现的闭包
Fn
,允许它们基本上在任何地方被调用。
这些限制直接来自 self
的类型和闭包的 "desugaring" 结构;在我的博客中描述 post Finding Closure in Rust.
有关闭包的信息,请参阅 Rust 编程语言 中的 Closures: Anonymous Functions that Can Capture Their Environment。
闭包实现 Fn
、FnMut
和 FnOnce
特征的具体条件是什么?
即:
- 闭包什么时候不实现
FnOnce
特征? - 什么时候闭包不实现
FnMut
特征? - 什么时候闭包不实现
Fn
特征?
例如,改变其主体上的闭包状态会使编译器无法在其上实现 Fn
。
每个特征都代表了关于 closures/functions 的越来越多的限制性属性,由它们的 call_...
方法的签名指示,特别是 self
的类型:
FnOnce
(self
)是可以调用一次的函数FnMut
(&mut self
) 是可以调用的函数,如果它们可以&mut
访问其环境Fn
(&self
) 是可以调用的函数,如果它们只有&
访问其环境
闭包 |...| ...
将自动实现尽可能多的闭包。
- 所有闭包实现
FnOnce
: 一个不能调用一次的闭包名不副实。请注意,如果闭包仅实现FnOnce
,则只能调用一次。 - 不移出其捕获实现的闭包
FnMut
,允许它们被多次调用(如果有对函数对象的非别名访问)。 - 不需要 unique/mutable 访问其捕获实现的闭包
Fn
,允许它们基本上在任何地方被调用。
这些限制直接来自 self
的类型和闭包的 "desugaring" 结构;在我的博客中描述 post Finding Closure in Rust.
有关闭包的信息,请参阅 Rust 编程语言 中的 Closures: Anonymous Functions that Can Capture Their Environment。