我看到Rust 的趋势,Result
个错误返回如下:
fn do_something() -> Result<SomeType, Box<dyn std::error::Error>> {
// ...
}
为什么错误是动态的?来自C++背景,比classic 多态性(我比较Rust )要高std::variant
,我对动态分配过敏,所以只有在我真正需要时才使用.我还发现Rust的枚举非常棒,因为它包含了变种.有人能解释一下为什么将错误用作枚举不是标准/首选/常见的吗?
我看到Rust 的趋势,Result
个错误返回如下:
fn do_something() -> Result<SomeType, Box<dyn std::error::Error>> {
// ...
}
为什么错误是动态的?来自C++背景,比classic 多态性(我比较Rust )要高std::variant
,我对动态分配过敏,所以只有在我真正需要时才使用.我还发现Rust的枚举非常棒,因为它包含了变种.有人能解释一下为什么将错误用作枚举不是标准/首选/常见的吗?
在应用程序代码中,这通常是为了方便.静态地知道所有错误类型可能是维护的噩梦:可能的错误类型的枚举不断扩大,其中大多数错误类型永远不会单独处理.这些错误类型会在远离实际发生错误的地方污染类型签名.Box<dyn std::error::Error>
使事情变得非常干净,额外的分配通常不是问题,因为它只发生在错误的情况下.
在库 crate 中比较少见,但一些非常通用的代码不可能知道所有可能的错误类型.在编写多个结果类型时,处理类型参数的错误可能会变得非常笨拙.一个可能的静态已知错误组合的复杂 struct 可以方便地折叠成单一类型,即Box<dyn std::error::Error>
.