Result<type, Box<dyn std::error::Error>> 的 Rust 简写

gra*_*wat 6 rust

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

fn something() -> Result<(), Box<dyn std::error::Error>> {
  Ok(())
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 7

您可以只使用泛型参数定义类型别名。很多板条箱都是这样的:

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

fn something() -> Result<()> {
  Ok(())
}
Run Code Online (Sandbox Code Playgroud)

  • 为了灵活性,我什至建议使用错误的默认值:`type Result&lt;T, E = Box&lt;dyn std::error::Error&gt;&gt; = std::result::Result&lt;T, E&gt;;`这样您就可以在任何地方使用“自定义”结果别名,它只是在错误端有一个相关的默认值。天啊,为了方便起见,你甚至可以默认“T = ()”之类的。 (5认同)

use*_*342 7

anyhow板条箱由 serde 的作者编写,是围绕一种Box<dyn std::error::Error>名为 的人体工程学替代方案而设计的anyhow::Error。它定义anyhow::Result<T>为以下别名Result<T, anyhow::Error>

fn something() -> anyhow::Result<()> {
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

缺点是它是一个外部板条箱,尽管它是一种使用非常广泛且经过充分测试的板条箱。

好处是,您可以获得良好的人体工程学、附加功能(例如context()with_context()Result)以及重要的优化 -anyhow::Error是窄指针而不是宽指针,因此与 相比,您的sResult更小且更高效Box<dyn Error>