如何简洁地将 &str 上的迭代器转换为字符串集合



我是Rust新手,在字符串上使用函数转换序列似乎很尴尬,因为它们通常返回&str

例如,下面是一个实现,我尝试读取由空格分隔的两个单词组成的行,并将它们存储到元组容器中:

use itertools::Itertools;
fn main() {
let s = std::io::stdin()
.lines()
.map(|l| l.unwrap())
.map(|l| {
l.split(" ")
.collect_tuple()
.map(|(a, b)| (a.to_string(), b.to_string()))
.unwrap()
})
.collect::<Vec<_>>();
println!("{:?}", s);
}

https://play.rust-lang.org/?version=nightly&模式= debug&版= 2018,要点= 7 f6d370457cc3254195565f69047018c

因为split返回&str对象的迭代器,其作用域是map使用的lambda,所以我看到返回它们的唯一方法是手动将它们转换回strings。这看起来很尴尬。

有没有更好的方法来实现这样一个程序?

Rust对分配是显式的。由lines()迭代器返回的String不会在迭代器链之外持续存在,因此不能仅将引用存储到它们中。因此,从逻辑上讲,需要在某处有一个to_string()(或to_owned,或String::from)

但是把它放在元组创建之后有点尴尬,因为它要求您调用该函数两次。您可以将split()的结果转换为拥有的对象。这应该可以工作:

.map(|l| {
l.split(" ")
.map(String::from)
.collect_tuple()
.unwrap()
})
.collect::<Vec<(_,_)>>();

请注意,现在您必须明确元组的类型。

最新更新