我正在尝试学习 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/