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.您始终可以将可以多次调用的闭包转换为只能调用一次的闭包:只需在第一次调用后丢弃与闭包关联的任何内存即可。但你不能用另一种方式把它转换回去。