error-handling - Rust 错误:在编译时无法知道 `(dyn std::error::Error + 'static)` 类型的值的大小
问题描述
首先,我想提一下,StackOverflow 和网络上有很多类似的问题,但我就是不知道如何为我的案例解决这个错误。
所以我有一个结构,它代表我自己的错误类型:
#[derive(Debug)]
pub struct Error {
msg: String,
}
然后我继续实施Display
并std::error::Error
针对我的错误类型:
impl Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.msg)
}
}
impl std::error::Error for Error {
fn description(&self) -> &str {
&self.msg
}
}
现在我尝试实现std::convert::From
,以便可以与运算符无缝地使用我的错误类型?
:
impl From<dyn std::error::Error> for Error {
fn from(err: dyn std::error::Error) -> Self {
Error {
msg: err.to_string(),
}
}
}
但是后来锈编译器给了我这个错误:
error[E0277]: the size for values of type `(dyn std::error::Error + 'static)` cannot be known
at compilation time
--> wasm_api/geohub_wasm_filehandler_api/src/lib.rs:33:6
|
33 | impl From<dyn std::error::Error> for Error {
| ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
我知道默认情况下,泛型函数仅适用于在编译时具有已知大小的类型。但我不知道如何正确解决这个问题。
谢谢你的帮助!
链接到 Rust-Playground 上的代码:
解决方案
正如@SirDarius 上面所说,您不能这样做,Error
因为 Error 不是一种类型,而是一种特征。(如果您来自 OOP,请将 Trait 视为接口。您无法将接口转换为另一种类型的对象,因为该接口没有任何底层状态——那里没有“那里”。)
处理此问题的正确方法是为您需要支持的每种具体类型实现 From。这个视频真的帮助我理解了这一切是如何结合在一起的。
推荐阅读
- javascript - Javascript检查JSON数组中是否存在数组所有项目
- swiftui - SwiftUI Picker and NavigationLink Gesture Conflicts
- sql - 过滤 PIVOT 信息
- selenium - Selenium - 上传多个文件会导致上传重复文件(第一个文件一次又一次)
- reactjs - React 站点 - 刷新时,Auth Route 无权访问 auth 上下文数据
- python - 如何将元组保存到 sys.stdin 中的某个变量
- javascript - JS - 如何在同一选项卡中打开一个 url,然后在 3 秒后重定向到另一个 url
- python - 创建一个 numpy 数组的置换浅表副本
- python - 从 tkinter 中删除多个标签
- ios - 如何使用启动故事板或 XIB?