V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tedzhou1221
V2EX  ›  Rust

FnOne 特征是至少调用一次还是只能调用一次?

  •  
  •   tedzhou1221 · 5 天前 · 236 次点击

    在看 B 站上的教程,看到关于 move 和 闭包的东西。 地址是 https://b23.tv/dXol75P

    其实中说 FnOne 是至少调用一次。

    还有 Rust 圣经中也同样这么说。 内容如下:

    所有的闭包都自动实现了 FnOnce 特征,因此任何一个闭包都至少可以被调用一次

    但 Kimi 的解释是:

    FnOnce 的设计目标是确保闭包在调用时可以安全地消耗变量的所有权,而不是强制要求闭包必须被调用。换句话说:

    “只能调用一次”:闭包被设计为只能调用一次,以避免多次调用导致的错误。
    “至少调用一次”:这不是 FnOnce 的要求。闭包可以选择不被调用,但一旦调用,就不能再次调用。
    

    大致意思就是“只能调用一次”

    我的理解也是只能调用一次。

    ps: 前几天看到有个推荐 Rust 教程的页面,说《 Rust 语言圣经》错误太多。我现在找不到出处了。请问有哪些是错误的?

    PTLin
        1
    PTLin  
       5 天前
    调用 FnOnce 闭包其实展开是这样
    ```rust
    #![feature(impl_trait_in_bindings)]
    #![feature(fn_traits)]
    use std::ops::FnOnce;
    fn main(){
    let a:impl FnOnce()=||{};
    a.call_once(());
    }
    ```
    call_once(self, args: Args),签名是这样,第一个参数会消耗闭包的所有权,但是有些情况闭包的匿名结构体会被实现 Copy ,这时候即使是 FnOnce 也可以多次被调用。
    nebkad
        2
    nebkad  
       3 天前
    在实际效果上,FnOnce 最多被调用一次。
    在抽象意义上,FnOnce 是 FnMut 和 Fn 的超集,因为 FnMut 和 Fn 总是可以理解为消耗一个 &mut Self 和 &Self 来完成一次调用,而 &mut Self 和 &Self 可以视为 Clone 的(不同的 &mut Self 必然有 lifetime 的区别但也算是可 Clone)
    这个逻辑不是那么直观,但还算自洽
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1805 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:42 · PVG 16:42 · LAX 00:42 · JFK 03:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.