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

如何让Holder结构体持有任意生命周期的Data类型指针?

解决方案

要让Holder的data字段能持有任意生命周期的Data类型,核心是利用原始指针不追踪生命周期约束的特性,具体补全方式如下:

补全后的完整代码

struct Data<'arg> {
    object: &'arg usize,
}
struct Holder {
    data: *const ()
}

impl Holder {
    pub fn new<'arg>(data: &Data<'arg>) -> Self {
        // 将 &Data<'arg> 转换为不带生命周期的原始指针
        Self { data: data as *const _ as *const () }
    }
}

原理说明

  • 原始指针(如*const ())本身不携带生命周期信息,因此可以存储任意生命周期的Data实例的指针,不受'arg生命周期的限制。
  • 转换过程是安全的:先把&Data<'arg>隐式转换成*const Data<'arg>,再强转为*const ()擦除类型和生命周期细节。

为什么不推荐dyn Trait方案

你提到的*const dyn Trait方案要求'arg生命周期必须长于'static,这是因为Rust中动态 trait 对象默认绑定'static生命周期(即使显式指定自定义生命周期,Holder作为无生命周期参数的结构体也无法持有这类带约束的对象),因此无法满足“持有任意生命周期”的需求。

内容的提问来源于stack exchange,提问作者chila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:22:08