1

我想创建一个迭代器来遍历一个大文件中的记录。

for record in huge_file.iter() {
  println!("{}", record.read_field("name"));
}

每个单独的记录都太大而无法放入内存,因此迭代器无法返回Record所有已加载到内存中的对象。底层存储不支持随机访问,因此返回存储的“切片”/“视图”也不是一种选择。

相反,我希望迭代器返回允许使用者从文件中的当前“光标位置”读取的元素。从表面上看,API 看起来像这样:

impl Iterator for HugeFileIterator {
  fn next<'a>(&'a mut self) -> Option<&'a mut Record> {
    ...
  }
}

impl Record {
  fn read_field(name: &str) -> &str {
    ...
  }
}

使用 的签名nextmut借用确保消费者Record在调用next()获取“下一个”时不能保留对“上一个”的引用Record

但是,我无法让该类型签名next按我想要的方式工作。该Iterator特征需要我定义一个关联Item类型,我不知道它应该是什么样子:

impl Iterator for HugeFileIterator {
  type Item<'a> = &'a mut Record; // ← Obviously doesn't work

  fn next<'a>(&'a mut self) -> Option<Self::Item<'a>> {
    ...
  }
}

是否可以在 Rust 类型系统中表达这种约束?或者是否有另一种我没有想过的完全不同的方法?

4

0 回答 0