我正在尝试将HashMap
转换为String
,其中每个项目由,
分隔,并且使用格式key:value
表示键/值对。
例如,HashMap
HashMap::from([
(1, 5),
(2, 10),
(3, 20),
]);
应该转换为字符串
3:20,2:10,1:5
我下面的代码似乎可以工作,我只能通过使用一种奇怪的方式来连接map
闭包中的字符串来让它工作。我也不明白为什么第一个元素需要使用.to_owned()
,而最后一个元素使用.as_str()
。
.map(|(k, v)| String::from(k.to_string().to_owned() + ":" + v.to_string().as_str()) )
有更好的方式来写这个吗?
use std::collections::HashMap;
fn main() {
let foo = HashMap::from([
(1, 5),
(2, 10),
(3, 20),
]);
let res = foo
.iter()
.map(|(k, v)| String::from(k.to_string().to_owned() + ":" + v.to_string().as_str()) )
.collect::<Vec<String>>()
.join(",");
println!("{}", res);
}
我可能会在这里使用format!
:
use std::collections::HashMap;
fn main() {
let foo = HashMap::from([
(1, 5),
(2, 10),
(3, 20),
]);
let res = foo
.iter()
.map(|(k, v)| format!("{}:{}", k, v))
.collect::<Vec<String>>()
.join(",");
println!("{}", res);
}
游乐场
如果你真的想避免不必要的Vec
和中间的String
分配(参见这个问题),你可以采用稍微不同的方法,并使用fold:
use std::collections::HashMap;
use std::fmt::Write;
fn main() {
let foo = HashMap::from([(1, 5), (2, 10), (3, 20)]);
let res = foo.iter().fold(String::new(), |mut s, (k, v)| {
if !s.is_empty() {
s.push(',');
}
write!(s, "{}:{}", k, v).expect("write! on a String cannot fail");
s
});
println!("{}", res);
}
游乐场