如何从静态上下文中调用具有生存期的函数



我需要从静态上下文(如(调用一个在self上指定生存期的函数

impl  <'w> World<'w> {
pub fn test_with_lifetime(&'w mut self) {
println!("test with lifetime");
}
pub fn test(&mut self) {
println!("test");
}
}
pub fn main(){
let mut world:World = World::new();
let world_rc:Rc<RefCell<World<'static>>> = Rc::new(RefCell::new(world));
let world_in_closure = Rc::clone(&world_rc);

let bx = Box::new(move ||{
if let Ok(mut borrowed_world) = world_in_closure.try_borrow_mut() {
borrowed_world.test_with_lifetime();
}
});
(bx)();

}

如果以"借来的价值活得不够长…"失败错误

所以我有两个问题:

  • &self和函数定义中的CCD_ 1?它们不是都有效地意味着对象存在于调用者的上下文中吗?

  • 有什么方法可以编译它吗?

操场

pub fn test(&mut self)不是pub fn test(&'w mut self)的快捷方式。相反,它是pub fn test<'a>(&'a mut self)的快捷方式。

不同之处在于寿命的定义:'w是类型的一部分。它由创建实例的人决定。取&'w mut self,通常意味着这个函数可以被调用零次(如果实例的寿命没有'w长(或一次(如果它的寿命有(。更重要的是,它不能,因为'w包含在类型中,它必须短于或等于实例的生存期。在你用'w调用它一次之后,它的余生都会被不断地借用。

另一方面,&'w self0意味着函数的调用者决定生存期。它可以(通常也是(与整个调用一样短,不需要是整个实例的生存期。

最新更新