如何将Iterator
<&str>
转换为String
,并插入一个常量字符串,如"\n"
?例如,给定:
let xs = vec!["first", "second", "third"];
let it = xs.iter();
我们可以通过collect
ing生成一个Vec<&str>
和join
ing结果来生成一个字符串s
:
let s = it
.map(|&x| x)
.collect::<Vec<&str>>()
.join("\n");
但是,这不必要地为Vec<&str>
分配内存。
有没有更直接的方法?
3条答案
按热度按时间rryofs0p1#
你可以使用 itertools crate来实现。我在示例中使用了 intersperse 帮助器,它几乎等同于迭代器的 join。
cloned()
需要将&&str
项转换为&str
项,但它不执行任何分配。当rust@1.36
获得稳定版本时,它最终可以被copied()
取代。Playground
yhived7q2#
你可以通过使用迭代器的
fold
函数轻松地做到这一点:完整的代码如下所示:
Playground
编辑:在塞巴斯蒂安Redl的评论之后,我检查了折叠使用的性能成本,并在操场上创建了一个benchmark test。
您可以看到,对于许多迭代方法,
fold
的使用要花费更多的时间。disbfnqx3#
rust文档中有相关的例子:给你。
你也可以使用
Extend
trait: