我有一个文件,其中包含一些复杂数据类型的多个实例(考虑事件的轨迹)。读取此文件的API用C编写,我对此没有太多控制。要将其暴露给Rust,我实现了以下接口:
// a single event read from the file
struct Event {
a: u32,b: f32,}
// A handle to the file used for I/O
struct EventFile;
impl EventFile {
fn open() -> Result<EventFile,Error> {
unimplemented!()
}
// read the next step of the trajectory into event
fn read(&self,event: &mut Event) -> Result<(),Error> {
event.a = unimplemented!();
event.b = unimplemented!();
}
}
要访问文件内容,我可以调用read
函数,直到它返回类似于以下内容的Err
:
let event_file = EventFile::open();
let mut event = Event::new();
let mut result = event_file.read(&mut event);
while let Ok(_) = result {
println!("{:?}",event);
result = event_file.read(&mut event);
}
由于事件被read
的每次调用所重用,因此不会重复分配/取消分配内存,从而有望提高性能(事件结构在实际实现中要大得多)。
现在,很高兴能够通过迭代器访问此数据。但是,据我了解,这意味着每次迭代器产生时,我都必须创建一个Event
的新实例-因为我无法在迭代器中重用该事件。这会损害性能:
struct EventIterator {
event_file: EventFile,}
impl Iterator for EventIterator {
type Item = Event;
fn next(&mut self) -> Option<Event> {
let mut event = Event::new(); // costly allocation
let result = self.event_file.read(&mut event);
match result {
Ok(_) => Some(event),Err(_) => None,}
}
}
let it = EventIterator { event_file };
it.map(|event| unimplemented!())
是否有办法以某种方式在迭代器中“回收”或“重用”事件?还是这个概念根本无法转移到Rust,在这种情况下,我必须使用迭代器才能获得更好的性能?