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()
返回Iterator
s,而不是切片。你可以使用as_bytes()
,它会给你一个&[u8]
. 但是,您不能直接&[char]
从 a获取 a &str
,因为只存在字节本身,而char
s 必须通过查看并查看每个字节组成的字节数来创建。你必须做这样的事情:
text.chars()
.collect::<Vec<char>>()
.chunks(n)
.map(|c| c.iter().collect::<String>())
.collect::<Vec<String>>()
.join(" ");
Run Code Online (Sandbox Code Playgroud)
但是,我不建议这样做,因为它必须在此过程中为Vec
s 和String
s分配大量临时存储空间。相反,你可以做这样的事情,只需要分配来创建最终的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 与一个迭代器,它要么是字符,要么是空格,然后是字符。