2017-02-11 9 views
4

Ich möchte jeden Iterator in MyType konvertieren können.Implementieren von Von einer Eigenschaft, die Self als Mitglied hat

impl<T, I: IntoIterator<Item = T>> From<I> for MyType<T> 

Wie in

MyType<T>::from<I: IntoIterator>(iter: I) -> MyType<T> 

Wie man erwartet, ist es sinnvoll für MyType sich auf ein Iterator wandelbar macht und erfüllen IntoIterator als Merkmal, und es tut.

Aber From wird automatisch reflexiv für jede Art implementiert, kann jeder Typ in sich natürlich umwandeln, und das ist, wo der Compiler bellt:

error[E0119]: conflicting implementations of trait 
`std::convert::From<MyType<_>>` for type `MyType<_>`: 

Meine generische Implementierung für alle IntoIterators Konflikte mit dem Standard ein. Wenn Rust keinen Standardlieferanten geliefert hat, dann würde es funktionieren, obwohl es unnötig teuer ist.

Gibt es eine Möglichkeit, das Merkmal für jedes Mitglied von IntoIterator außer MyType zu implementieren?

+0

Querverweis auf [r/rost] (https://www.reddit.com/r/rust/comments/5tfrfc/implementation_for_trait_that_is_already_provided/). –

Antwort

4

Es gibt tatsächlich einen Präzedenzfall in der Rust-Standardbibliothek: Iterator::collect ist über das Erstellen eines neuen Werts von einem Iterator.

Folgen Sie diesem Modell, anstatt std::convert::From zu implementieren, sollten Sie std::iter::FromIterator implementieren.

Und dann wird es keinen Konflikt geben.

Verwandte Themen