Ich möchte eine .unique()
Methode für Iteratoren definieren, die es mir ermöglicht, ohne Duplikate zu iterieren.Wie kann ich neue Methoden zu Iterator hinzufügen?
use std::collections::HashSet;
struct UniqueState<'a> {
seen: HashSet<String>,
underlying: &'a mut Iterator<Item=String>
}
trait Unique {
fn unique(&mut self) -> UniqueState;
}
impl Unique for Iterator<Item=String> {
fn unique(&mut self) -> UniqueState {
UniqueState { seen: HashSet::new(), underlying: self }
}
}
impl<'a> Iterator for UniqueState<'a> {
type Item = String;
fn next(&mut self) -> Option<String> {
while let Some(x) = self.underlying.next() {
if !self.seen.contains(&x) {
self.seen.insert(x.clone());
return Some(x)
}
}
None
}
}
Dies kompiliert. Allerdings, wenn ich versuchen, in der gleichen Datei zu verwenden:
fn main() {
let foo = vec!["a", "b", "a", "cc", "cc", "d"];
for s in foo.iter().unique() {
println!("{}", s);
}
}
ich die folgende Fehlermeldung erhalten:
src/main.rs:34:25: 34:33 error: no method named `unique` found for type `core::slice::Iter<'_, &str>` in the current scope
src/main.rs:34 for s in foo.iter().unique() {
^~~~~~~~
note: in expansion of for loop expansion
src/main.rs:34:5: 36:6 note: expansion site
src/main.rs:34:25: 34:33 help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `unique`, perhaps you need to implement it:
src/main.rs:34:25: 34:33 help: candidate #1: `Unique`
Was mache ich falsch? Wie würde ich diese willkürlichen hashbaren Typen erweitern?
Perfect, danke! Ich werde das auf kates.io werfen, ich hoffe, das ist in Ordnung. –
@ WilfredHughes Das ist in Ordnung, aber Sie können es in die [Iertools Kiste] (http://bluss.github.io/rust-itertools/doc/itertools/index.html), die ein großes Repository für diese ist beitragen Arten von Ergänzungen. – Shepmaster
Ausgezeichnete Idee! https://github.com/bluss/rust-itertools/pull/30 –