Rust 如何将生存期检查推迟到运行时

Rust 如何将生存期检查推迟到运行时,rust,lifetime,Rust,Lifetime,我正试图把一个非静态的闭包传递到东京。显然这不起作用。有没有办法确保生命周期在运行时是合适的?以下是我尝试过的: 尝试使用Arc 为了不将闭包直接传递给tokio,我将其放入管理计时器的结构中: 类型延迟>; 发布结构计时器>>, } 该结构的impl允许我们轻松添加和删除计时器。我的计划是通过移动一个弱的参考点,以某种方式将静态关闭传递到东京 要创建静音哈希映射,请执行以下操作: //记住处理函数 delays.insert(key.clone(),Box::new(func)); //创建

我正试图把一个非静态的闭包传递到东京。显然这不起作用。有没有办法确保生命周期在运行时是合适的?以下是我尝试过的:

尝试使用
Arc
为了不将闭包直接传递给tokio,我将其放入管理计时器的结构中:

类型延迟>;
发布结构计时器>>,
}
该结构的
impl
允许我们轻松添加和删除计时器。我的计划是通过移动一个
弱的
参考点,以某种方式将静态关闭传递到东京
要创建静音哈希映射,请执行以下操作:

//记住处理函数
delays.insert(key.clone(),Box::new(func));
//创建对延迟映射的弱引用以传递到闭包中
让弱处理程序=Arc::降级(&self.delays);
//延迟后运行的任务
让任务=延迟::新建(即时::现在()+延迟)
.map_err(| e | warn!(“东京定时器错误:{}”,e))//将错误类型映射到()
.然后| | |{
//从表中获取处理程序,我们只有一个弱引用。
let handler=Weak::升级(&Weak\u处理程序)
.ok_或(())?//如果弧丢失,则返回一个错误,从而中止未来
.lock()
。删除(&键)
.ok_或(())?;//如果处理程序不再存在,我们也可以中止。
//呼叫处理程序
handler();
好(())
});
因此,如果散列表被删除,使用
我们确保中止

重要的是要知道,生命周期
'l
计时器
结构的生命周期相同,但是我如何告诉编译器呢?另外,我认为真正的问题是
弱:'static
不令人满意

使用
unsafe
我尝试构建类似的东西来实现这一点。首先,Sc会在这里工作吗?我阅读代码并理解它。我看不到任何明显的问题-尽管很难得出结论,即
map
方法实际上是安全的,因为引用肯定会被放在
map
的末尾,而不会存储在某处

所以我试着让Sc适应我的需要。这只是一个粗略的概述,我知道这其中存在一些问题,但我相信这样的事情应该是可能的:

  • 拥有一个将拥有
    T
  • Doa::ref(&self)->DoaRef
    将生成一个不透明对象,该对象内部包含对所属对象的
    *const u8
    • doref
      不包含具有非静态寿命的引用,因此可以传递给tokio
  • 为Doa设置
    impl Drop
    ,将
    *const u8
    设置为
    null
  • 因此,
    DoaRef
    现在可以检查该值是否仍然存在,并获取对它的引用
我还试图确保
ref
中的
&self
的生命周期必须大于
T
中引用的生命周期,以确保只有
Doa
确实比指针指向的对象的生命周期长时,这种方法才有效

struct Doa<'t, T: 'l> { ... }
pub fn ref(&'s self) -> DoaRef<T> where 't: 'a
struct-Doa{…}
pub fn ref(&'s self)->DoaRef其中的't:'a
但是
T
是终生约束的,因为
DoaRef
在它上面被参数化了
DoaRef:“static
不再有效

或者有一些板条箱,或者甚至是
std
中的某些东西可以做到这一点吗