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

[Rust] 关于三种 return Error trait 的区别是什么,如何辨别使用场景?

  •  
  •   lasuar · 2022-10-02 18:13:04 +08:00 · 1500 次点击
    这是一个创建于 818 天前的主题,其中的信息可能已经有所发展或是发生改变。
    use std::error::Error;
    use std::fmt::{Debug, Display, Formatter};
    
    pub fn test() {
        #[derive(Debug)]
        struct MyErr;
        impl Display for MyErr {
            fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
                f.write_str("MyErr happened")
            }
        }
        impl Error for MyErr {}
    
        // 三种返回 error 方式的区别是什么? 待解答
    
        fn f3() -> Result<i32, impl Error> {
            Result::Err(MyErr)
        }
        fn f3_1() -> Result<i32, Box<dyn Error>> {
            Result::Err(Box::new(MyErr))
        }
        fn f3_2() -> Result<i32, &'static dyn Error> {
            Result::Err(&MyErr)
        }
    }
    

    求大佬解答,给个链接也行~

    4 条回复    2022-10-03 06:59:54 +08:00
    lasuar
        1
    lasuar  
    OP
       2022-10-02 18:23:02 +08:00
    111
    gwy15
        2
    gwy15  
       2022-10-02 18:54:48 +08:00   ❤️ 1
    第一种是返回一个实现了 StdError trait 的类型,不建议这么写
    第二种是返回 trait object ,可以这么写,适用于非常简单的场景
    第三种几乎永远不会用。

    你的 Error 实现方式也是有问题的,现在的做法 库 一般会用 thiserror ,应用 /业务一般用 anyhow
    lasuar
        3
    lasuar  
    OP
       2022-10-02 19:34:53 +08:00
    @gwy15 谢谢,我研究一下
    DTCPSS
        4
    DTCPSS  
       2022-10-03 06:59:54 +08:00 via iPhone
    impl Error 应该会给每一种 Error 生成一份代码,用空间换速度。一般用 2 。或者直接用 thiserror 库做库异常处理,用 anyhow 库做应用异常处理。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2776 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:33 · PVG 21:33 · LAX 05:33 · JFK 08:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.