web-dev-qa-db-ja.com

Rustエラー:タイプ `(dyn std :: error :: Error + 'static)`の値のサイズはコンパイル時に不明です

まず最初に、StackOverflowやWebの周りに同様の質問がたくさんあることを述べたいと思いますが、私の場合、このエラーを解決する方法がわかりません。

だから私は自分のエラータイプを表す構造体を持っています:

#[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(),
        }
    }
}

しかし、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
   |

デフォルトでは、ジェネリック関数はコンパイル時に既知のサイズを持つ型でのみ機能することを知っています。しかし、この問題を適切に解決する方法がわかりません。

ご協力いただきありがとうございます!

Rust-Playgroundのコードへのリンク:

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

6
Samuel Dressel

@SirDariusが上で述べたように、Errorに対してこれを行うことはできません。エラーはタイプではなく、それが特性だからです。 (OOPを使用している場合は、Traitをインターフェースのように考えてください。インターフェースには基礎となる状態がないため、インターフェースを別のタイプのオブジェクトに変換することはできません。「そこ」はありません。)

これを処理する正しい方法は、サポートする必要がある具象型ごとにFromを実装することです。 このビデオ は、これがどのように組み合わされるかを理解するのに本当に役立ちました。

1
Tim Keating