我是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&mode=debug&edition=2018&gist=7f6d370457cc3254195565f69047018c
因为split
返回&str
对象的迭代器,它的作用域是map
使用的lambda,所以我看到的返回它们的唯一方法是手动将它们转换回string
。这看起来真的很尴尬。
有没有更好的方法来实施这样的计划?
1条答案
按热度按时间hgc7kmma1#
Rust对分配是显式的,
lines()
迭代器返回的String
不会在迭代器链之外持久化,所以你不能只把引用存储到其中,因此,逻辑上,需要有一个to_string()
(或to_owned
,或String::from
)* 某处 *。但是把它放在元组创建之后有点尴尬,因为它需要你调用函数两次。你可以把
split()
的结果转换成拥有的对象。这样应该可以工作:请注意,现在您必须明确元组类型。