我想创建一个迭代器来遍历一个大文件中的记录。
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 类型系统中表达这种约束?或者是否有另一种我没有想过的完全不同的方法?