2017-12-14 3 views
0

Dieser Code funktioniert:Warum implementiert die Standardbibliothek nicht Collect auf einem Tupel-Iterator ohne cloned()?

use std::collections::HashMap; 

fn main() { 
    let result: HashMap<&str, &str> = [("name", "Luke")].iter().cloned().collect(); 

    println!("{:?}", &result); 
} 

es nicht, wenn ich den Anruf zu cloned() entfernen:

error[E0277]: the trait bound `std::collections::HashMap<&str, &str>: std::iter::FromIterator<&(&str, &str)>` is not satisfied 
--> src/main.rs:4:65 
    | 
4 |  let result: HashMap<&str, &str> = [("name", "Luke")].iter().collect(); 
    |                 ^^^^^^^ a collection of type `std::collections::HashMap<&str, &str>` cannot be built from an iterator over elements of type `&(&str, &str)` 
    | 
    = help: the trait `std::iter::FromIterator<&(&str, &str)>` is not implemented for `std::collections::HashMap<&str, &str>` 

Mein Verständnis ist, dass die Standard-Bibliothek vieler Dinge für Tupel implementiert, aber nicht diesen Fall? Warum sollte es nicht so kompilieren?

Antwort

3

Die vollständige Fehlermeldung mehr Informationen hat, die nützlich ist:

error[E0277]: the trait bound `std::collections::HashMap<&str, &str>: std::iter::FromIterator<&(&str, &str)>` is not satisfied 
--> src/main.rs:4:65 
    | 
4 |  let result: HashMap<&str, &str> = [("name", "Luke")].iter().collect(); 
    |                 ^^^^^^^ a collection of type `std::collections::HashMap<&str, &str>` cannot be built from an iterator over elements of type `&(&str, &str)` 
    | 
    = help: the trait `std::iter::FromIterator<&(&str, &str)>` is not implemented for `std::collections::HashMap<&str, &str>` 

Ihr Code ohne .cloned() versucht, ein HashMap aus einem Iterator von Verweisen auf Tupel zu machen, aber die HashMap::from_iter() Methode erfordert einen Iterator von eigener Tupel . Der .cloned() Anruf schaltet das Iterator von Referenzen in ein Iterator von eigener Tupel, die zu HashMap::from_iter() gegeben werden können (was .collect() wird Aufruf am Ende)

Der Grund, dass die Standard-Bibliothek nicht HashMap::from_iter() für einen Iterator von Tupel nicht implementiert Referenzen sind, weil HashMap das Tupel besitzen muss, um den Schlüssel und den Wert davon zu erhalten, was unmöglich ist, wenn es einen Verweis auf ein Tupel übergeben wird.

+0

Könnten Sie die Frage von OP zu ** why ** beantworten? Die Standardbibliothek implementiert 'FromIter' nicht für Referenzen von Tupeln? – Shepmaster

+0

Fertig. Ich denke, dass ich die Erklärung richtig verstanden habe. – BookOwl

+0

Sehr geschätzt. Warum kann es nicht ref tuple-Werte verwenden? Das funktioniert: 'let tup = & (& 1, &2); println! (" {:?} ", tup.0);' –

Verwandte Themen