当“T”未实现“Debug”时替代“unwrap()”

Mat*_*nti 9 rust unwrap

我知道x.unwrap()x: Result<T, E>不实现时不起作用EDebug需要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!"),
   }
Run Code Online (Sandbox Code Playgroud)

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

caf*_*e25 6

惯用的代码只会转发错误:

\n
fn do_it() -> Result<(), E> {\n   let x_ok = x_ok?;\n   // work with x_ok\n   Ok(())\n}\n
Run Code Online (Sandbox Code Playgroud)\n

或在可能的情况下优雅地处理错误:

\n
let x_ok = x_ok.unwrap_or(sane_default);\n
Run Code Online (Sandbox Code Playgroud)\n

如果两者都不是一个选择,并且您绝对必须恐慌,您可以使用let \xe2\x80\xa6 else

\n
let Ok(x_ok) = x_ok else { panic!("Something went horribly wrong") };\n
Run Code Online (Sandbox Code Playgroud)\n


use*_*342 5

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

let x_ok = x.unwrap_or_else(|_| panic!("Something went horribly wrong!"));
Run Code Online (Sandbox Code Playgroud)

  • @cafce25 适当指出,但这是你的个人偏好 - 在 `unwrap_or_else()` 中恐慌既合理又常见,特别是当恐慌在词汇上可见时,就像这里的情况一样。 (4认同)