给定以下代码:

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

impl Holder {
    pub fn new<'arg>(data: &Data<'arg>) -> Self {
        Self { data }
    }
}

它应该如何完成才能使"数据"保存任何生命周期内的任何数据?

如果我使用一个*const dyn Trait,它要求‘arg超越’静态.如果对dyn Trait的引用被传递给new,它要求它的引用超过‘静态.

推荐答案

您可以使用'static并转换类型,但请注意不要实际公开对数据的任何'static引用,因为这将是不可靠的:

struct Holder {
    data: *const Data<'static>
}

impl Holder {
    pub fn new<'arg>(data: &Data<'arg>) -> Self {
        let data = (data as *const Data<'arg>).cast::<Data<'static>>();
        Self { data }
    }
}

Rust相关问答推荐

是否有可能同时避免不兼容的不透明类型和代码重复?

使用 struct 外部的属性来改变 struct 的原始方式

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

如何go 除铁 rust 中路径组件的第一项和最后一项?

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

Tokio_Postgres行上未显示退回特性的生存期,且生命周期 不够长

重写Rust中的方法以使用`&;mut self`而不是`mut self`

一种随机局部搜索算法的基准(分数)

为什么';t std::cell::ref使用引用而不是非空?

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

如何以与平台无关的方式将OsString转换为utf-8编码的字符串?

如何获取模块树?

有什么方法可以通过使用生命周期来减轻嵌套生成器中的当生成器产生时borrow 可能仍在使用错误?

我如何取消转义,在 Rust 中多次转义的字符串?

如果不满足条件,如何在 Rust 中引发错误

如何将 Rust 中的树状 struct 展平为 Vec<&mut ...>?

为什么在 macOS / iOS 上切换 WiFi 网络时 reqwest 响应会挂起?

在 Rust 中返回对枚举变体的引用是个好主意吗?

当引用不再被borrow 时,Rust 不会得到它

如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?