You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:47:34