我正在尝试将字符串的向量收集到分隔符为$
的字符串中。
let v = [String::from("bump"), String::from("sage"),String::from("lol"), String::from(" kek ")];
let s: String = v.into_iter().map(|x| x.push_str("$")).collect();
println!("{:?}",s );
上面的代码不起作用,但是:
let v = [String::from("hello"), String::from("world"),String::from("shit"), String::from(" +15 ")];
let s: String = v.into_iter().collect();
println!("{:?}",s );
正在工作。如何解决此问题?
3条答案
按热度按时间qf9go6mv1#
您的代码不起作用,因为
push_str()
不返回字符串。所以你的
map()
函数从String
Map到()
,因为你没有从它返回x
。此外,
x
是不可变的,因此不能在其上调用push_str()
。必须声明它为mut
。这是您的代码,经过最小程度的修改,it works:
第一个
此外,如果您只推送一个字符,请执行
push('$')
。然而,你会注意到字符串的末尾有一个
$
,你的用例非常适合reduce()
,所以我会用@Aleksander的答案来代替。hiz5n14c2#
你可以使用Iterator::reduce。注意它只会在 * 项之间放置分隔符(而不是像Petterrabit's答案中那样在字符串的末尾),并且它会重用第一个字符串的分配(这会带来稍微更好的内存效率)。
1aaf6o9v3#
必须从Map返回字符串。
请注意,
push_str
不返回任何内容。https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=50534d454a46093299ce38682733c86a
编辑
如果您的真实的用例更复杂,并且必须使用迭代器和Map,您应该更喜欢上面的答案,因为这样做更好(不需要拥有从Map返回的字符串,因为无论如何都要将它们收集到一个新的字符串中)。
但也就是说,如果唯一的目的是加入你的Vec与分离器,你应该简单地这样做