Итератор с элементами `&mut`

Я хочу создать итератор для перебора записей в огромном файле.

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 {
    ...
  }
}

С этой подписью next, mut заем гарантирует, что потребитель не может сохранить ссылку на "предыдущий 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? Или, может быть, есть другой совершенно другой подход, о котором я не думал?

0 ответов

Другие вопросы по тегам