Rust FFI:如何用返回引用的Iterator封装C风格迭代器?
为C库生成器实现Rust安全迭代器接口的问题
我需要为一个C库创建Rust安全接口,这个库提供了一个生成器函数:传入源指针(比如文件指针)后,每次调用该函数会返回指向源中后续元素的指针,本质是一个迭代器。但有个关键限制:再次调用生成器函数后,之前拿到的元素指针会失效。
目前我是通过克隆元素来使用,但克隆带来了显著的性能损耗,而很多场景下完全不需要这么做。我想实现一个和C接口逻辑对齐的安全封装,当前的思路是:
- 用
Source结构体封装源指针,同时保存当前有效的Element - 用
Element结构体封装元素指针,支持直接使用引用,也支持安全克隆
对应的结构体定义如下:
struct Source { current_element: Element, source_pointer: *mut S, } // 可直接使用&Element,也可安全克隆为Element struct Element { element_pointer: *mut E, }
为了封装生成器的迭代行为,我打算为Source实现Iterator trait:每次调用next()时,调用C的生成器函数拿到新元素指针,更新Source中的current_element,然后返回它的引用——这个引用只需要在下次调用next()之前保持有效即可。大致的实现思路如下:
impl Iterator for Source { type Item = ∈ fn next(&mut self) -> Option<Self::Item> { let new_pointer = unsafe { generator_ffi_function(self.source_pointer) }; if new_pointer.is_null() { None } else { self.current_element.element_pointer = new_pointer; Some(&self.current_element) } } }
但我无法解决这个实现中的生命周期问题。想请教:这种预期的接口在Rust中是否可以实现?如果可以,具体该怎么做?
补充说明:我之前尝试过一些方案,要么是使用可变引用导致后续调用受限,要么是直接返回裸指针存在安全风险;另外很多可变迭代器的方案假设仅存在一个引用,这一点我无法保证。
内容的提问来源于stack exchange,提问作者J.Lewandowski
相关产品推荐
相关产品推荐

