まず最初に、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 のコードへのリンク:
ベストアンサー1
@SirDarius が上で述べているように、Error
Error は型ではなく特性であるため、これを実行することはできません。(OOP から移行している場合は、特性をインターフェイスのように考えてください。インターフェイスには基礎となる状態がないため、インターフェイスを別の種類のオブジェクトに変換することはできません。つまり、そこには「そこ」がありません。)
これを処理する正しい方法は、サポートする必要がある具体的な型ごとに From を実装することです。このビデオこれらすべてがどのように組み合わさっているかを理解するのに本当に役立ちました。