fn append_newline(data: impl Iterator<Item = u8>) -> impl Iterator<Item = u8> {
data.chain(std::iter::once(b'\n'))
}
fn main() {
let s = "Hello";
let s_iter_with_newline = append_newline(s.bytes());
for b in s_iter_with_newline {
println!("{:?}", b as char);
}
}
1条答案
按热度按时间yi0zb3m41#
如果你要求一个操作接受一个
&[u8]
并返回另一个包含换行符字节的&[u8]
,而不重新分配,那么答案是这是不可能的。&[u8]
是always连续的内存,因此换行符字节必须物理上位于切片的末尾,这只能通过重新分配来实现。此外,使用&[u8]
切片不可能做到这一点,因为它不支持mut
。然而,你实际上可以用迭代器达到类似的效果。它不会分配,只是在所有其他字节产生后提供另一个换行符字节。
当然,这与需要
&[u8]
作为参数的函数不兼容。进一步说明:
&[u8]
,听起来像是字符串操作。请注意,Rust字符是而不是u8
- Rust字符串是可变大小的UTF-8字符的列表。这就是&str
/String
类型存在的原因。使用它们来处理字符串,因为它们可以处理特殊字符,不像&[u8]
。当然,您在这里遇到的'\n'
问题仍然存在于str
中,如果没有重新分配,它仍然是不可能的。