我看到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>.

Rust相关问答推荐

我怎样才能从一个Rust 的日期中go 掉3年?

如何为utoipa中的可选查询参数生成OpenAPI模式?

Rust:跨多个线程使用hashmap Arc和rwlock

通过使用光标拖动角来绕其中心旋转矩形

替换可变引用中的字符串会泄漏内存吗?

是否可以使用Rust宏来构建元组的项?

我应该将哪些文件放入我的GitHub存储库

在Rust中判断编译时是否无法访问

异步函数返回的future 生存期

完全匹配包含大小写的整数范围(&Q;)

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

要求类型参数有特定的大小?

如何正确使用git2::Remote::push?

‘&T as *const T as *mut T’ 在 ‘static mut’ 项目中合适吗?

当在lambda中通过引用传递时,为什么会出现终身/类型不匹配错误?

强制特征仅在 Rust 中的给定类型大小上实现

使用泛型作为关联类型,没有幻像数据

Rust 中的运行时插件

守卫如何影响匹配语句?