作为Rust的新手,我正在努力在生锈方式中实现一个简单的问题。我想通过读取N个字节的块(片)来处理每个utf-8字符的文件/管道(没有除读取缓冲区之外的其他内存分配)。
一旦我处理了我读过的一个块的所有字符,如果最后一个utf-8字符跨越两个块边界,则可能会剩下几个字节。如果想在切片的开头复制这些字节(所以我可以通过读取完成我的缓冲区),但借用检查器会妨碍。
在伪代码中:
file.read(buffer);
let mut remaining = buffer.slice_to(…);
while remaining.is_empty() == false {
if no_char { break; }
// here, process first char
remaining = remaining.slice_from(char_len);
}
// here, copy "remaining" at the beginning of "buffer"
借用检查器的问题是"缓冲区"在"剩余"仍然在范围内。我不能做一个" copy_memory"在他们身上。
我知道我可以更改算法,因此我不会使用切片,而是访问"缓冲区"所有时间都使用方括号运算符。我还可以存储"剩余"的最后一个长度,以及剩余的"剩余的"超出范围我可以手动复制字节。但是我喜欢切片的概念(就像我在C ++中可以使用一对迭代器来引用集合中的范围一样),我想知道是否有一种安全且生锈的方法。
PS:我意识到使用" .chars()"在缓冲文件上比使用" lines()"慢和#34; chars()"。所以我想知道读取固定大小的块有多快。
修改:在上面的代码段中用clone
替换了slice_to