4 votes

Est-il possible d'exclure un type de l'implémentation des traits génériques ?

J'essaie de créer un type d'erreur avec une couverture From pour toute Error Toutefois, comme ce type est lui-même un Error J'ai des conflits :

pub struct ApiError(pub i64, pub String);

impl<T: Error> From<T> for ApiError {
    fn from(err: T) -> Self {
        Self(500, err.to_string())
    }
}

impl Error for ApiError {}

error[E0119]: conflicting implementations of trait `std::convert::From<ApiError>` for type `ApiError`
 --> src/lib.rs:5:1
  |
5 | impl<T: Error> From<T> for ApiError {
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: conflicting implementation in crate `core`:
          - impl<T> From<T> for T;

Je suppose que c'est à cause du cycle que j'ai créé en mettant en oeuvre Error en ApiError . Est-il possible de dire quelque chose comme T: Error & not ApiError et d'exclure mon type particulier de cette mise en œuvre globale pour From ?

Si ce n'est pas possible, je suis curieux de savoir comment de toute façon semble faire quelque chose de similaire ?

5voto

Michael Anderson Points 21181

Vous ne pouvez pas le faire dans Rust, mais il existe une solution de contournement.

Je regarde les documents, anyhow::Error ne met pas en œuvre Error Au lieu de cela, il a mis en œuvre Deref<Error> (et autres traits similaires). Cela permet anyhow::Error pour être converti silencieusement en &Error .

Cela signifie qu'il peut désormais mettre en œuvre From<T:Error> sans se heurter au conflit que vous mentionnez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X