Rust エラー: `(dyn std::error::Error + 'static)` 型の値のサイズはコンパイル時に知ることができません 質問する

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

ベストアンサー1

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

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

おすすめ記事