Rust 闭包何时实现Fn、FnMut和FNOCE?
关闭实现Rust 闭包何时实现Fn、FnMut和FNOCE?,rust,closures,Rust,Closures,关闭实现Fn、FnMut和FnOnce特征的具体条件是什么 即: 什么时候闭包不实现FnOnce特征 什么时候闭包不实现FnMut特征 什么时候闭包不实现Fn特征 例如,改变其主体上闭包的状态会使编译器无法在其上实现Fn。每个特征代表闭包/函数越来越多的限制性属性,通过其调用方法的签名,特别是self的类型表示: (self)是可以调用一次的函数 (&mut self)是可以调用的函数,如果它们具有对其环境的&mut访问权限 (&self)是只有对其环境具有&访问权限时才能调用的函数 闭
Fn
、FnMut
和FnOnce
特征的具体条件是什么
即:
- 什么时候闭包不实现
特征FnOnce
- 什么时候闭包不实现
特征FnMut
- 什么时候闭包不实现
特征Fn
例如,改变其主体上闭包的状态会使编译器无法在其上实现
Fn
。每个特征代表闭包/函数越来越多的限制性属性,通过其调用方法的签名,特别是self
的类型表示:
- (
self
)是可以调用一次的函数
- (
&mut self
)是可以调用的函数,如果它们具有对其环境的&mut
访问权限
- (
&self
)是只有对其环境具有&
访问权限时才能调用的函数
闭包|…|…
将自动实现尽可能多的闭包
- 所有闭包都实现了
FnOnce
:不能一次调用的闭包不值得命名。请注意,如果闭包只实现一次FnOnce
,则只能调用一次
- 不移出捕获的闭包实现
FnMut
,允许多次调用它们(如果存在对函数对象的无关联访问)
- 不需要对捕获进行唯一/可变访问的闭包实现了
Fn
,允许在任何地方调用它们
这些限制直接来自于self
类型和闭包到结构中的“去糖化”;在我的博客文章中描述
有关闭包的信息,请参阅Rust编程语言中的。您最近看到过这个吗?如果闭包只实现FnOnce
,这是否意味着它只能被调用一次?我误读了Nalpy的注释,这给我带来了一些混乱。未来的读者,请注意,他说“如果闭包只实现FnOnce
”。实现细节:将自动实现尽可能多的闭包。这并不完全正确,如果需要,它将自动实现它们。您可以使用专门化检测用于FnMut参数的闭包缺少的Fn impl。这是一个bug,我仍然很难理解所有闭包如何实现FnOnce
,即使它们可以被多次调用。这种特质的名称令人困惑。有两种方法可以考虑:1。FnOnce
中的“one”指的是调用方调用它的次数上限,而不是调用它的次数上限。2.您始终可以将可以多次调用的闭包转换为只能调用一次的闭包:只需在第一次调用后丢弃与闭包关联的任何内存即可。但你不能用另一种方式把它转换回去。