首先,我想说的是,在StackOverflow和网络上有很多类似的问题,但我就是不知道如何解决这个错误.

所以我有一个 struct ,它代表我自己的错误类型:

#[derive(Debug)]
pub struct Error {
    msg: String,
}

然后我继续为我的错误类型实现Displaystd::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
    }
}

现在我try 实现std::convert::From,这样我就可以与?操作符无缝地使用我的错误类型:

impl From<dyn std::error::Error> for Error {
    fn from(err: dyn std::error::Error) -> Self {
        Error {
            msg: err.to_string(),
        }
    }
}

但是rust编译器给了我这个错误:

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
   |

我知道,默认情况下,泛型函数只能在编译时具有已知大小的类型上工作.但是我想不出如何正确地解决这个问题.

谢谢你的帮助!

Link to code on Rust-Playground:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=568900e8c7847c1f79781fa9bb6d499d

推荐答案

正如@SirDarius上面所说的,你不能用Error来做这件事,因为错误不是一种类型,而是一种trait .(如果你来自OOP,可以考虑像接口这样的特性.你不能将接口转换成另一种类型的对象,因为接口没有任何底层状态——那里没有"there".)

正确的处理方法是为需要支持的每个具体类型实现From.This video真的帮助我理解了这一切是如何结合在一起的.

Rust相关问答推荐

阻止websocket中断的中断中断的终端(操作系统错误4)

在rust中如何修改一个盒装函数并将其赋回?

如何容器化Linux上基于Rust的Windows应用程序的编译过程?

创建包含缺失值的框架

为什么实例方法可以像Rust中的静态方法一样被调用?

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

如何使用盒装枚举进行模式匹配?

不能在一个代码分支中具有不变的自身borrow ,而在另一个代码分支中具有可变的self borrow

在Rust中,Box:ed struct 与普通 struct 在删除顺序上有区别吗?

程序在频道RX上挂起

tokio::spawn 有和没有异步块

当推送到 HashMap 中的 Vector 时,类型 `()` 无法取消引用

Rust 如何将链表推到前面?

Rust:为什么 Pin 必须持有指针?

如何获取模块树?

为什么 Rust 的临时值有时有参考性有时没有?

切片不能被 `usize` 索引?

为什么具有 Vec 变体的枚举没有内存开销?

我如何将 google_gmail1::Gmail> 传递给线程生成?

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用