在一行中将键值对字符串转换为 HashMap

Convert key value pair string to HashMap in one line

我有一个字符串,内容如下:

key1:value1 key2:value2 key3:value3 ...

我想以 HashMap<&str, &str>(或等价物)结束,它映射字符串中的键和值(例如,“key1”的散列查找应该 return“value1”) .

目前,我可以轻松地用以下内容填充 HashMap:

let mut hm = HashMap::new();
for item in my_string.split_ascii_whitespace() {
    let splits = item.split(":").collect::<Vec<&str>>();
    hm.insert(splits[0], splits[1]);
}

但是,如果我想在一行中完成它怎么办(即使以可读性为代价,为了“代码高尔夫”之类的目的)?我知道如何用 HashSet 来做到这一点,所以我想它看起来有点相似;也许是这样的(实际上并没有编译):

let hm: HashMap<&str, &str> = HashMap::from_iter(my_string.split_ascii_whitespace().map(|s| s.split(":").take(2).collect::<Vec<&str>>()));

我已经尝试了与上述类似的不同组合,但我似乎找不到真正可以编译的东西。

我解决这个问题的方法是记住 Iterator<Item=(K, V)> 可以收集到 HashMap<K, V> 所以在知道我向后工作以试图弄清楚如何将 &strIterator<Item=(&str, &str)> 中,我使用 String find and split_at 方法设法做到了:

use std::collections::HashMap;

fn one_liner(string: &str) -> HashMap<&str, &str> {
    string.split_whitespace().map(|s| s.split_at(s.find(":").unwrap())).map(|(key, val)| (key, &val[1..])).collect()
}

fn main() {
    dbg!(one_liner("key1:value1 key2:value2 key3:value3"));
}

playground

第二个 map 调用是从值字符串中删除前导 : 字符所必需的。