rust 如何简单地将&str上的迭代器转换为String集合

h9a6wy2h  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(261)

我是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。这看起来真的很尴尬。
有没有更好的方法来实施这样的计划?

hgc7kmma

hgc7kmma1#

Rust对分配是显式的,lines()迭代器返回的String不会在迭代器链之外持久化,所以你不能只把引用存储到其中,因此,逻辑上,需要有一个to_string()(或to_owned,或String::from)* 某处 *。
但是把它放在元组创建之后有点尴尬,因为它需要你调用函数两次。你可以把split()的结果转换成拥有的对象。这样应该可以工作:

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

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

相关问题