ich den Wald nicht für die Bäume sehen kann, aber ich frage mich, wie kann ich eigentlich meine Methoden entwerfen nicht gegen harte Sammlungstypen zu arbeiten, aber gegen Iteratoren statt. Betrachten Sie diese Methode.Wie verwende ich den Iterator Merkmal generic APIs zu bauen
pub fn print_strings(strings: Vec<String>) {
for val in strings.iter() {
println!("{}", val);
}
}
Offensichtlich fällt diese kurz, wenn ich, dass ein mit verwenden möchten HashSet
oder HashMap
.
Also habe ich versucht, dies:
use std::collections::*;
fn main() {
let strings = vec!("Foo", "Bar");
let mut more_strings = HashMap::new();
more_strings.insert("foo", "bar");
more_strings.insert("bar", "foo");
print_strings(&strings.iter());
print_strings(&more_strings.values())
}
fn print_strings(strings: &Iterator<Item=&str>) {
for val in strings {
println!("{}", val);
}
}
Playpen
Leider (auch langwieriger Compiler-Fehler zu sehen), dies scheint nicht den Trick zu tun. Was vermisse ich?
Bitte fügen Sie die Fehlermeldung ein. Es zeigt Ihnen, was mit Ihrer Implementierung nicht stimmt.Vielleicht möchten Sie überprüfen, was der Typ von Iterator :: Item für den Iterator ist, den Sie haben. – Shepmaster
Ich denke nicht, dass das eine gute Idee ist, da es ziemlich lang ist. Sie können auf den Laufstall-Link klicken, um die gesamte Compiler-Fehlerausgabe anzuzeigen. – Christoph
Wenn Sie '.iter()' auf einem 'Vec' aufrufen, erhalten Sie einen 'Iterator - '. Wenn Sie '.iter()' auf einem 'Vec <&str>' aufrufen, erhalten Sie einen 'Iterator
- ', nicht einen 'Iterator
- '. Sie sollten sich die '.cloned()' Methode für 'Iterator' anschauen, damit Ihr Problem gelöst werden kann. –
Adrian