Ich habe eine Eigenschaft geschrieben, dass einige Methoden ähnlich denen von Vec
angibt:Wie kann ich FromIterator automatisch implementieren?
pub trait Buffer {
type Item;
fn with_capacity(c: usize) -> Self;
fn push(&mut self, item: Self::Item);
}
Ich möchte implementieren FromIterator
für alle Typen, die Buffer
implementieren, wie folgt:
impl<T> iter::FromIterator<T::Item> for T
where T: Buffer
{
fn from_iter<I>(iter: I) -> Self
where I: IntoIterator<Item = T>
{
let mut iter = iter.into_iter();
let (lower, _) = iter.size_hint();
let ans = Self::with_capacity(lower);
while let Some(x) = iter.next() {
ans.push(x);
}
ans
}
}
der Won-Compiler Lassen Sie mich:
error[E0210]: type parameter `T` must be used as the type parameter
for some local type (e.g. `MyStruct<T>`); only traits defined in the
current crate can be implemented for a type parameter
Ich glaube, ich verstehe die Fehlermeldung; Es hindert mich daran, Code zu schreiben, der nicht mit möglichen zukünftigen Änderungen der Standardbibliothek kompatibel ist.
Der einzige Weg um diesen Fehler scheint zu sein, FromIterator
für jeden Typ separat zu implementieren, für den ich Buffer
implementieren. Dies beinhaltet das Kopieren von genau demselben Code viele Male. Gibt es eine Möglichkeit, die gleiche Implementierung zwischen allen Buffer
Typen zu teilen?
* mit möglichen zukünftigen Änderungen an der Standardbibliothek * - nicht nur an der Standardbibliothek, sondern an jeder Bibliothek, mit der Ihr Code in der Zukunft verlinkt (oder verlinkt sein kann). – Shepmaster