【问题标题】:Rust shorthand for Result<type, Box<dyn std::error::Error>>Result<type, Box<dyn std::error::Error>> 的 Rust 简写
【发布时间】:2021-11-04 09:37:49
【问题描述】:

在进行错误捕获时,我通常让函数返回结果。但是我觉得每次都写 Result> 真的很冗长,有没有一些内置的简写?

fn something() -> Result<(), Box<dyn std::error::Error>> {
  Ok(())
}

【问题讨论】:

  • Tangential,但我发现定义一个 enum 包装我可能遇到的所有错误类型(每种类型一个变体,每个变体都包装错误)然后 impl From&lt;ErrType&gt; for MyErrorWrapper 更容易对于每个包装的ErrType。你仍然可以使用? 来冒泡错误,并且不需要装箱。

标签: rust


【解决方案1】:

您可以使用泛型参数定义类型别名。许多箱子都是这样的:

type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;

fn something() -> Result<()> {
  Ok(())
}

【讨论】:

  • 为了灵活性,我什至建议为错误使用默认值:type Result&lt;T, E = Box&lt;dyn std::error::Error&gt;&gt; = std::result::Result&lt;T, E&gt;; 这样您就可以在任何地方使用您的“自定义”结果别名,它只是在错误方面有一个相关的默认值。见鬼,为方便起见,您甚至可以默认 T = () 或其他东西。
【解决方案2】:

anyhow crate 由 serde 的作者编写,是围绕 Box&lt;dyn std::error::Error&gt; 的人体工程学替代方案设计的,称为 anyhow::Error。它将anyhow::Result&lt;T&gt; 定义为Result&lt;T, anyhow::Error&gt; 的别名:

fn something() -> anyhow::Result<()> {
    Ok(())
}

缺点是它是一个外部板条箱,尽管它非常受欢迎且经过良好测试。

好处是您可以获得良好的人体工程学设计、附加功能(例如 Result 上的 context() and with_context())以及非平凡的优化 - anyhow::Error 是窄指针而不是宽指针,所以您的 @ 987654333@s 比Box&lt;dyn Error&gt; 更小更高效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2019-01-04
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    相关资源
    最近更新 更多