我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 ,因为它似乎不被推荐,所以我希望有一种标准的方法来解决这个问题.

我还没有试着查过其他镶木地板的资料库.

推荐答案

这在Rust中是一个难题,因为你实际上是在try 创建一个self-referential struct 体.

幸运的是,您一般不需要解决这个问题,因为您正在使用的库为这个用例提供了直接支持:impl IntoIterator for SerializedFileReader<File>.所以:

    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.into_iter();
        let column_type = *dataset_info.column_type.clone();
        let iterator = ParquetRecordIterator {
            iterator: iter,
            column_type: column_type,
            i: 0,
        };
        Ok(Box::new(iterator))
    }

Rust相关问答推荐

如何在rust中有条件地分配变量?

在泛型 struct 的字段声明中访问关联的Conant

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

如何格式化传入Rust中mysql crate的Pool::new的字符串

如何创建一个可变的嵌套迭代器?

Rust面向对象设计模式

具有多个键的 HashMap

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

我可以用 Rust 编写一个不可变变量

将引用移动到线程中

Rust:为什么 Pin 必须持有指针?

Rust 打包在 .deb 中

我可以在 Rust 中 serde struct camel_case 和 deserde PascalCase

在不安全的 Rust 中存储对 struct 内部数据的静态引用是否合法?

Rust 中的生命周期:borrow 的 mut 数据

如何刷新 TcpStream

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

当我在 struct 中存储异步函数时,为什么它需要生命周期

从 Cranelift 发出 ASM

为什么在使用 self 时会消耗 struct 而在解构时不会?