Non riesco a vedere la foresta per gli alberi ma mi chiedo come faccio a progettare i miei metodi in modo che non funzionino contro i tipi di raccolta rigida ma contro Iterator. Considera questo metodo.Come utilizzare il tratto Iterator per creare API generiche
pub fn print_strings(strings: Vec<String>) {
for val in strings.iter() {
println!("{}", val);
}
}
Ovviamente questo cade breve se voglio usare quella con una HashSet
o HashMap
.
Così, ho provato questo:
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);
}
}
Box (anche per visualizzare errore di compilazione lungo)
Purtroppo, questo non sembra fare il trucco sia. Cosa mi manca?
Si prega di includere il messaggio di errore. Ti dice cosa c'è di sbagliato nella tua implementazione.Si consiglia di rivedere quale tipo di 'Iterator :: Item' è per l'iteratore che si ha. – Shepmaster
Non penso che sia una buona idea in quanto è piuttosto lunga. È possibile fare clic sul collegamento della casella per visualizzare l'output dell'intero errore del compilatore. – Christoph
Quando si chiama '.iter()' su un 'Vec', si ottiene un 'Iterator - '. Quindi quando chiamate '.iter()' su un 'Vec <&str>', ottenete un 'Iterator
- ', non un 'Iterator
- '. Dovresti dare un'occhiata al metodo '.cloned()' per 'Iterator', dovrebbe aiutare a risolvere il tuo problema. –
Adrian