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
中的某些东西可以做到这一点吗