Как создать карту из списка функциональным способом?

В Scala существует метод с именем toMap, который работает в любом списке кортежей и преобразует его в карту, где ключ является первым элементом в кортеже, а значение является вторым:

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

Что самое близкое к toMap в Rust?

Ответ 1

Используйте 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 использует FromIterator trait. Любой итератор может быть собран в тип, реализующий FromIterator. В этом случае HashMap реализует его как:

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

С другой стороны, любой итератор кортежей, где первое значение может быть хэшированным и по сравнению с общим равенством можно преобразовать в HashMap. Параметр S не интересен для обсуждения, он просто определяет, что такое метод хеширования.