Typ Problem mit Iterator sammeln
Ich versuche, zu konvertieren, ein Vektor, der &str
Paare in eine HashMap
mit dem folgenden code-snippet:
use std::collections::HashMap;
fn main() {
let pairs = vec!(("foo", "bar"), ("toto", "tata"));
let map: HashMap<&str, &str> = pairs.iter().collect();
println!("{:?}", map);
}
Jedoch schlägt die Kompilierung fehl mit dieser Fehlermeldung:
<anon>:5:47: 5:56 error: the trait `core::iter::FromIterator<&(&str, &str)>` is not implemented for the type `std::collections::hash::map::HashMap<&str, &str>` [E0277]
<anon>:5 let map: HashMap<&str, &str> = pairs.iter().collect();
Aber wenn ich .cloned()
vor dem Aufruf collect()
alles gut funktioniert:
...
let map: HashMap<&str, &str> = pairs.iter().cloned().collect();
...
Selbst wenn ich verstehe die Fehlermeldung (es ist keine Implementierung der Eigenschaft FromIterator<&(&str, &str)>
für die Art HashMap<&str, &str>
) ich verstehe nicht, wo der Typ &(&str, &str)
kommt aus dem (nach der Signatur der Methode in der Rost-Dokumentation) und warum ruft cloned()
behebt das problem.
InformationsquelleAutor Jcs | 2015-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Art
&(&str, &str)
kommt von dem, wasiter()
auf eineVec
gibt:wo
Iter<T>
implementiertIterator<Item=&T>
:In anderen Worten,
iter()
auf einem vector gibt einen iterator nachgeben Referenzen in den Vektor.cloned()
löst das problem, weil es ein iterator-adapter, die konvertiertIterator<Item=&T>
zuIterator<Item=T>
wennT
ist cloneable. Sie können denken, es als eine Kurzform fürmap(|v| v.clone())
:Passiert es, dass
(&str, &str)
ist klonbar, da jedes Tupel Komponente ist auch klonbar (alle Verweise sind), socloned()
würde ein Objekt zurückgeben, das dieIterator<Item=(&str, &str)>
- genau das, wascollect()
muss, erstellen Sie eineHashMap
.Alternativ können Sie
into_iter()
zu bekommenIterator<Item=T>
ausVec<T>
, aber dann die original-Vektor verbraucht:InformationsquelleAutor Vladimir Matveev
Das problem ist, dass, während die Verweise kopiert werden, die Tupel nicht.
Jedoch, wenn Sie don ' T müssen die Paare nicht mehr, Sie kann die Iteration durch die Werte:
InformationsquelleAutor llogiq