我试着使用自定义迭代器的切片,看起来我必须使用lifetime,但我并不总是有任何东西可以绑定它
下面是一个例子:
struct FileBlockReader {
file_reader: BufReader<File>
}
impl FileBlockReader {
pub fn new(file: File) -> FileBlockReader {
FileBlockReader {
file_reader: BufReader::new(file)
}
}
}
字符串
我想在FileBlockReader
上实现迭代器,通过X字节的切片读取数据:
impl<'a> Iterator for FileBlockReader {
type Item = &'a [u8];
fn next(&mut self) -> Option<Self::Item> {
todo!()
}
}
型
我必须将lifetime指定为Item
,但我应该绑定它吗?
数据的所有者是FileBlockReader
中的file_reader
。但是因为它不是引用,所以我不能给它添加生存期说明符。
我发现唯一的方法是将BufReader
中的File
转换为引用。然后我可以添加生存期说明符。
但我希望FileBlockReader
成为File
的所有者
我该怎么做?
1条答案
按热度按时间hmtdttj41#
正如您已经注意到的,您必须能够将
'a
生存期绑定到实现Iterator
的类型上的某些内容。如果你想直接在
FileBlockReader
上实现Iterator
,这是没有办法的。你需要为你的迭代器创建一个单独的类型,像这样:字符串
标准库中的所有迭代器都存在相同的限制。
Vec
没有实现Iterator
。相反,您必须调用iter()
方法来获取从vec * 借用 * 数据的迭代器。