如何在 Rust 中将字符串拆分为块以插入空格

Zek*_*eke 9 string chunks rust

我正在尝试学习 Rust。我最近遇到的一个问题如下:给定 a String,它正好是 n 的倍数,我想将字符串分成大小为 n 的块,并在这些块之间插入一个空格,然后收集回一个细绳。

我遇到的问题是该chars()方法返回Chars结构体,由于某种原因它没有实现SliceConcatExt特征,因此chunks()不能对其调用。

此外,一旦我成功创建了一个 Chunks 结构(通过调用.bytes()代替),我不确定如何调用 a.join(' ')因为元素现在Chunks是字节切片......

必须有一种优雅的方式来做到这一点,我错过了。

例如,这里是一个说明情况的输入/输出:

given: whatupmyname, 4
output: what upmy name
Run Code Online (Sandbox Code Playgroud)

这是我写得不好的尝试:

given: whatupmyname, 4
output: what upmy name
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助!

Jay*_*epp 13

这里的问题是,chars()bytes()返回Iterators,而不是切片。你可以使用as_bytes(),它会给你一个&[u8]. 但是,您不能直接&[char]从 a获取 a &str,因为只存在字节本身,而chars 必须通过查看并查看每个字节组成的字节数来创建。你必须做这样的事情:

text.chars()
    .collect::<Vec<char>>()
    .chunks(n)
    .map(|c| c.iter().collect::<String>())
    .collect::<Vec<String>>()
    .join(" ");
Run Code Online (Sandbox Code Playgroud)

但是,我不建议这样做,因为它必须在此过程中为Vecs 和Strings分配大量临时存储空间。相反,你可以做这样的事情,只需要分配来创建最终的String.

text.chars()
    .enumerate()
    .flat_map(|(i, c)| {
        if i != 0 && i % n == 0 {
            Some(' ')
        } else {
            None
        }
        .into_iter()
        .chain(std::iter::once(c))
    })
    .collect::<String>()
Run Code Online (Sandbox Code Playgroud)

这一直作为迭代器直到最后一次收集,通过 flat_mapping 与一个迭代器,它要么是字符,要么是空格,然后是字符。