我想在Rust中为C库创建安全接口.该库提供了一个生成器函数,该函数可以在某些源代码上多次调用(例如,文件)指针产生指向该源的后续元素的指针--基本上它是一个迭代器.
可以使用该元素指针做一些有用的事情,但在再次调用生成器函数后,前一个指针变得无效.元素也可以安全地克隆(这就是我现在使用的),但这会带来显著的性能损失,这在许多用例中是完全不必要的.
我想创建一个类似于C接口的安全包装器接口.我现在的 idea 是,我用struct Element
包装元素指针,用struct Source
包装源指针,它也保存当前有效的Element
.
struct Source {
current_element: Element,
source_pointer: *mut S,
}
// things can be done with &Element directly
// or it can be safely cloned to Element
struct Element {
element_pointer: *mut E,
}
为了包装生成器行为,我想为Source
实现Iterator
forSource
,它在每次迭代中生成新的ELEMENT_POINTER,包装它,赋值给Source
,并返回对current_element
的引用,该引用只在.next()
被再次调用之前有效.大概是这样的:
impl Iterator for Source {
type Item = &Wrapper;
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_wrapper.element_pointer = new_pointer;
Some(&self.current_wrapper)
}
}
}
但我无法解决如何在这种情况下使用生命周期.预期的接口可以在Rust中实现吗?如果可以,如何实现?
This solution是行不通的,因为当string_holder
被&'a mut
打破的时候.This example包装了类似的C接口,但返回指针,因此不安全.许多问题也涉及实现可变迭代器,但我不想给出&mut
个,这些解决方案还假设只有一个引用存在,这一点我不能保证.