【问题标题】:Alternative to `unwrap()` when `T` does not implement `Debug`当 `T` 没有实现 `Debug` 时替代 `unwrap()`
【发布时间】:2023-02-04 20:47:03
【问题描述】:

我知道 x.unwrap()x: Result<T, E> 不工作时 E 没有实现 Debug: unwrap() 需要打印出 Err 变体以防 x.is_err() 但它不能。然而,有时,尤其是在测试中,我确实需要获得 Ok 值。我假设 x.expect() 可以解决问题,因为我是指定失败消息的人。然而,出于某种原因我不完全理解,expect() 也需要 E: Debug。这意味着我最终总是采用冗长、重复的方式:

   let x_ok = match x {
      Ok(x_ok) => x_ok,
      Err(_) => panic!("Something went horribly wrong!"),
   }

我无法想象这个问题不会有更标准化的解决方案,但我很难找到一个。如果ResultErr 类型没有实现Debug,如何快速get_ok_or_panic

【问题讨论】:

    标签: rust unwrap


    【解决方案1】:

    典型的解决方法是使用unwrap_or_else()

    let x_ok = x.unwrap_or_else(|_| panic!("Something went horribly wrong!"));
    

    【讨论】:

    • 我只会在我可以提供一个理智的替代方案的情况下使用unwrap_or_else,不要惊慌。当然,除非您也针对旧的 Rust 版本。
    • @cafce25 已正式指出,但这是您的个人偏好 - unwrap_or_else() 中的恐慌既合理又常见,尤其是当恐慌在词汇上可见时,就像这里的情况一样。
    【解决方案2】:

    惯用代码只会转发错误:

    fn do_it() -> Result<(), E> {
       let x_ok = x_ok?;
       // work with x_ok
       Ok(())
    }
    

    或尽可能优雅地处理错误:

    let x_ok = x_ok.unwrap_or(sane_default);
    

    如果两者都不是一个选项并且你绝对必须恐慌你可以使用let … else

    let Ok(x_ok) = x_ok else { panic!("Something went horribly wrong") };
    

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 2020-07-19
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2012-08-04
      相关资源
      最近更新 更多