Итератор с элементами `&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? Или, может быть, есть другой совершенно другой подход, о котором я не думал?