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

标签 string rust chunks

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

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

此外,一旦我成功创建了 Chunks 结构(通过调用 .bytes()),我不确定如何调用 .join(' ') 因为元素现在是 byte slice 的 Chunks...

必须有一种优雅的方式来完成我所缺少的。

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

given: whatupmyname, 4
output: what upmy name

这是我写得不好的尝试:

let n = 4;
let text = "whatupmyname".into_string();
text.chars()
    // compiler error on chunks() call
    .chunks(n)
    .collect::<Vec<String>>()
    .join(' ')

最佳答案

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

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

但是,我不推荐这样做,因为它必须为 Vec 分配大量临时存储空间。 s 和 String一路走来。相反,你可以做这样的事情,它只需要分配来创建最终的 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>()

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

关于string - 如何在 Rust 中将字符串拆分为 block 以插入空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57029974/

相关文章:

rust - 将 `&str` 附加到 `String` 的最有效方法是什么?

Angular 7 - 隔离部署工作区应用程序(项目)

java - 如何将Android字符串数组加载到ListView中?

c++ - 逐字获取String Word的函数

string - 如何在clojure中检查字符串是否为大写?

python - "chunk"、 "block"、 "offset"、 "buffer"和 "sector"是什么意思?

angular - 如何将视频文件作为 Angular block 上传(版本 8)

c - strtok 表现出不良行为

redis - 调用使用redis-rs创建redis连接的函数时如何防止生命周期问题

rust - 你如何在使用rust 的 Windows 上使用带有 DLL 的 DynamicLibrary?