如何以功能方式从列表创建地图?

时间:2015-05-25 15:37:35

标签: rust

在Scala中,有一个名为toMap的方法适用于任何元组列表并将其转换为一个映射,其中键是元组中的第一个项,值是第二个:

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

Rust中toMap最接近的是什么?

2 个答案:

答案 0 :(得分:26)

使用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,

换句话说,元组的任何迭代器都可以将第一个值be hashedcompared for total equality转换为HashMapS参数并不令人兴奋,它只是定义了散列方法的内容。

另见:

答案 1 :(得分:0)

由于尚未提及,因此这里是一行(尽管很长)的方法:

use std::collections::HashMap;

fn main() {
   let m: HashMap<&str, u16> = [("year", 2019), ("month", 12)].iter().cloned().collect();
   println!("{:?}", m);
}

或者您可以进行特质:

use std::collections::HashMap;

trait Hash {
   fn to_map(&self) -> HashMap<&str, u16>;
}

impl Hash for [(&str, u16)] {
   fn to_map(&self) -> HashMap<&str, u16> {
      self.iter().cloned().collect()
   }
}

fn main() {
   let m = [("year", 2019), ("month", 12)].to_map();
   println!("{:?}", m)
}

https://doc.rust-lang.org/std/collections/struct.HashMap.html#examples