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

Schreibe einen Kommentar