我try 使用parquet
库在一个函数中创建一个记录迭代器对象,可以使用我自己的trait RecordIterator
进行迭代.它看起来像这样:
fn blah(dataset_info: DatasetInfo, file: File) -> Result<Box<dyn RecordIterator<Item=Record>>, Box<dyn Error>> {
let reader = SerializedFileReader::new(file).unwrap();
let iter = (&reader).get_row_iter(None).unwrap();
let column_type = *dataset_info.column_type.clone();
let iterator = ParquetRecordIterator {
iterator: iter,
column_type: column_type,
i: 0,
};
Ok(Box::new(iterator))
}
问题是,由于ITER的SerializedFileReader变量有一个生命周期,因此返回ParquetRecordIterator(它实现RecordIterator特征)对象时会报告错误:
cannot return value referencing local variable `reader` [E0515]
理想情况下,我不想在这里打破抽象,那么您建议如何实现此函数?实际上,我希望断开阅读器和迭代器之间的生命周期链接,但不确定如何才能最好地做到这一点,或者使用不同的parquet API来实现这一点.
我试过将文件读取器包装在Box::new
中,希望生命期不会与堆中的对象绑定,但不幸的是,这似乎不起作用.
我没有try 过任何库来处理自引用 struct ,因为它似乎不被推荐,所以我希望有一种标准的方法来解决这个问题.
我还没有试着查过其他镶木地板的资料库.