Ошибка Rust: Размер значений типа `(dyn std :: error :: Error + 'stati c)` не может быть известен во время компиляции - PullRequest
2 голосов
/ 07 февраля 2020

Прежде всего я хочу упомянуть, что есть много похожих вопросов о 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
   |

Я знаю, что по умолчанию, generi c функции будут работать только на типах, которые имеют известный размер во время компиляции. Но я не могу понять, как правильно решить эту проблему.

Спасибо за вашу помощь!

Ссылка на код на Rust-Playground:

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

...