2015-05-25 5 views
10

In Scala, c'è un metodo chiamato toMap che funziona su qualsiasi elenco di tuple e lo converte in una mappa dove la chiave è il primo punto all'ordine del tupla e il valore è il secondo:Come si crea una mappa da un elenco in modo funzionale?

val listOfTuples = List(("one", 1), ("two", 2)) 
val map = listOfTuples.toMap 

Cosa è la cosa più vicina a toMap in Rust?

risposta

14

Uso Iterator::collect:

use std::collections::HashMap; 

fn main() { 
    let tuples = vec![("one", 1), ("two", 2), ("three", 3)]; 
    let m: HashMap<_, _> = tuples.into_iter().collect(); 
    println!("{:?}", m); 
} 

collect sfrutta il FromIterator trait. Qualsiasi iteratore può essere raccolto in un tipo che implementa FromIterator. In questo caso, HashMap implementa come:

impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S> 
where 
    K: Eq + Hash, 
    S: HashState + Default, 

Detto in altro modo, qualsiasi iteratore di tuple dove il primo valore può be hashed e compared for total equality può essere convertito in un HashMap. Il parametro S non è eccitante per parlare, definisce solo il metodo di hashing.

+0

Bello, quindi 'FromIterator' è' CanBuildFrom' di Rust :) (So che non lo è ma è sicuramente più facile da capire ...) –

Problemi correlati