IntoHandlerError не реализован для типа, который указан как реализованный для - PullRequest
0 голосов
/ 04 апреля 2020

У меня ошибка типа std :: boxed :: Box, и я хотел бы иметь возможность использовать IntoHandlerError для преобразования ее в ошибку, которую может gotham использовать. Компилятор услужливо говорит мне:

error[E0599]: no method named `into_handler_error` found for type `std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>` in the current scope
   --> web/src/main.rs:112:31
    |
112 |                     (state, x.into_handler_error())
    |                               ^^^^^^^^^^^^^^^^^^ method not found in `std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>`
    |
    = note: the method `into_handler_error` exists but the following trait bounds were not satisfied:
            `&dyn std::error::Error + std::marker::Send + std::marker::Sync : gotham::handler::error::IntoHandlerError`
            `&mut dyn std::error::Error + std::marker::Send + std::marker::Sync : gotham::handler::error::IntoHandlerError`
            `&mut std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync> : gotham::handler::error::IntoHandlerError`
            `&std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync> : gotham::handler::error::IntoHandlerError`
            `dyn std::error::Error + std::marker::Send + std::marker::Sync : gotham::handler::error::IntoHandlerError`
            `std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync> : gotham::handler::error::IntoHandlerError`

Я уверен, что я идиот, но тип, названный вверху, похоже, точно соответствует последнему перечисленному типу. Что дает?

Добавление разыменования не помогает:

error[E0599]: no method named `into_handler_error` found for type `&dyn std::error::Error + std::marker::Send + std::marker::Sync` in the current scope
   --> web/src/main.rs:124:45
    |
124 |                 Err(e) => Err((state, (&*e).into_handler_error()))
    |                                             ^^^^^^^^^^^^^^^^^^ method not found in `&dyn std::error::Error + std::marker::Send + std::marker::Sync`
    |
    = note: the method `into_handler_error` exists but the following trait bounds were not satisfied:
            `&&dyn std::error::Error + std::marker::Send + std::marker::Sync : gotham::handler::error::IntoHandlerError`
            `&dyn std::error::Error + std::marker::Send + std::marker::Sync : gotham::handler::error::IntoHandlerError`
            `&mut &dyn std::error::Error + std::marker::Send + std::marker::Sync : gotham::handler::error::IntoHandlerError`
            `&mut dyn std::error::Error + std::marker::Send + std::marker::Sync : gotham::handler::error::IntoHandlerError`
            `dyn std::error::Error + std::marker::Send + std::marker::Sync : gotham::handler::error::IntoHandlerError`

1 Ответ

1 голос
/ 05 апреля 2020

Разница между ними заключается в том, что ваш объект - Box<T>, а значение для &T. Поскольку Box реализует Deref, rust c будет искать импл для черты также на T, но не на &T.

Вы можете разыменовать Box и брать содержимое как & с использованием &*x, поэтому попробуйте (&*x).into_handler_error().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...