在Rust中从HashMap创建字符串时的字符串连接



我正在尝试将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);
}

游乐场

相关内容

  • 没有找到相关文章

最新更新