rust 如何创建切片作为自定义迭代器的Item

ndasle7k  于 2024-01-08  发布在  其他
关注(0)|答案(1)|浏览(159)

我试着使用自定义迭代器的切片,看起来我必须使用lifetime,但我并不总是有任何东西可以绑定它
下面是一个例子:

  1. struct FileBlockReader {
  2. file_reader: BufReader<File>
  3. }
  4. impl FileBlockReader {
  5. pub fn new(file: File) -> FileBlockReader {
  6. FileBlockReader {
  7. file_reader: BufReader::new(file)
  8. }
  9. }
  10. }

字符串
我想在FileBlockReader上实现迭代器,通过X字节的切片读取数据:

  1. impl<'a> Iterator for FileBlockReader {
  2. type Item = &'a [u8];
  3. fn next(&mut self) -> Option<Self::Item> {
  4. todo!()
  5. }
  6. }


我必须将lifetime指定为Item,但我应该绑定它吗?
数据的所有者是FileBlockReader中的file_reader。但是因为它不是引用,所以我不能给它添加生存期说明符。
我发现唯一的方法是将BufReader中的File转换为引用。然后我可以添加生存期说明符。
但我希望FileBlockReader成为File的所有者
我该怎么做?

hmtdttj4

hmtdttj41#

正如您已经注意到的,您必须能够将'a生存期绑定到实现Iterator的类型上的某些内容。
如果你想直接在FileBlockReader上实现Iterator,这是没有办法的。你需要为你的迭代器创建一个单独的类型,像这样:

  1. struct Blocks<'a> {
  2. reader: &'a mut FileBlockReader,
  3. }
  4. impl<'a> Iterator for Blocks<'a> {
  5. type Item = &'a [u8]
  6. fn next(&mut self) -> Self::Item {
  7. todo!()
  8. }
  9. }
  10. impl FileBlockReader {
  11. pub fn blocks(&mut self) -> Blocks<'_> {
  12. Blocks { reader: self }
  13. }
  14. }

字符串
标准库中的所有迭代器都存在相同的限制。Vec没有实现Iterator。相反,您必须调用iter()方法来获取从vec * 借用 * 数据的迭代器。

展开查看全部

相关问题