如何让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
相关产品推荐
相关产品推荐

