Asynchronous 根据调用和回调,当库用户可能会失败(Ref)单元借用检查时,如何使异步rust库安全

Asynchronous 根据调用和回调,当库用户可能会失败(Ref)单元借用检查时,如何使异步rust库安全,asynchronous,rust,Asynchronous,Rust,我需要一个想法如何解决这个问题的生锈的方式,因为我的程序是恐慌 我的lib有一个用于检查事件和运行闭包的循环。目前,我正在与一个简单的接近事件作斗争。我的引擎有一个API,用于注册on close事件和关闭窗口 //lib用户代码 //当s.o.单击“X”时,正在注册关闭窗口的回调 让window\u id=window.window\u id; engine.window_on_close(window.window_id,框::new(| env |{ 环境引擎窗口关闭(窗口id); }))

我需要一个想法如何解决这个问题的生锈的方式,因为我的程序是恐慌

我的lib有一个用于检查事件和运行闭包的循环。目前,我正在与一个简单的接近事件作斗争。我的引擎有一个API,用于注册on close事件和关闭窗口

//lib用户代码
//当s.o.单击“X”时,正在注册关闭窗口的回调
让window\u id=window.window\u id;
engine.window_on_close(window.window_id,框::new(| env |{
环境引擎窗口关闭(窗口id);
}));
//库代码
//轮询事件(glfw方式)
对于self.windows.borrow_mut().values_mut()中的窗口{
对于glfw::flush_消息(&window.events)中的(u,event){
比赛项目{
glfw::WindowEvent::Close=>{
window.invoke_on_close(&ce)?;
},
_ => {}
}
}
}
//结构引擎
发布fn窗口打开关闭(&mut self,func:F)
//其中F:。。。
{
// ...
}
发布fn窗口关闭(&mut self,窗口id:glfw::WindowId){
让mut-windows=self.windows.borrow_-mut();//对“已借用:借用muterror”感到恐慌
让mut window=windows.remove(&window_id).expect(“修复我”);
window.close();
}
当我点击“X”时,它很恐慌

另一件事是,这是一个库,所以我不知道库用户是否在关闭事件时关闭窗口(这是恐慌),或者用户是否只打印“hello,close”,这会起作用,我认为这对于库来说是一个糟糕的设计问题,如果库用户因为任何RefCell借用检查失败而陷入恐慌

为了更清楚,我以线性方式写下代码。当然,现在您和我可以两次看到
borrow_mut()
的问题所在,这在直接编写此代码时是可以避免的,但是我的lib只运行userland中用于关闭事件的代码,并且由于lib用户想要关闭窗口,因此失败了。不管怎样,现在我们可以看到,代码有一个bug,因为它在没有迭代器的情况下对哈希映射进行变异,同时对其进行迭代:

//1。lib用户注册关闭事件:
让window\u id=window.window\u id;
engine.window_on_close(window.window_id,框::new(| env |{
环境引擎窗口关闭(窗口id);
}));
// 2. 库代码轮询事件(glfw方式)
对于self.windows.borrow_mut().values_mut(){//HERE:borrow_mut()中的窗口
对于glfw::flush_消息(&window.events)中的(u,event){
比赛项目{
glfw::WindowEvent::Close=>{
//从回调粘贴的代码:`engine.window_close(…)`
让mut-windows=self.window.borrow_-mut();//这里:borrow_-mut()
让mut window=windows.remove(&window_id).expect(“修复我”);
window.close();
},
_ => {}
}
}
}
我是对的,事实上我唯一需要解决的是lib用户不能运行任何窗口突变,因为windows已经被借用了。其他的都行


您对此有何建议?

这与异步有什么关系?如果我正确理解了行与行之间的关系,那么这只是“如何在迭代时删除元素”,并添加了额外的内容?第一个选项有些常见,第二个选项听起来有些可疑,因为您已经在使用内部可变性,但它没有帮助。@vallentin它不是
rust async
,而是异步代码,所以当我回电话时,我不知道用户在做什么,可能会以借用而告终twice@kmdreko在迭代时删除将很容易,但它是在迭代时调用的
,lib user(回调实现者)可能会运行一个API fn来改变我正在迭代的数据结构,所以它会感到恐慌。这与异步有什么关系?如果我正确地读取了行之间的内容,这只是“如何在迭代时删除元素”,并且会有额外的内容?第一个选项有些常见,第二个选项听起来有些可疑,因为您已经在使用内部可变性,但它没有帮助。@vallentin它不是
rust async
,而是异步代码,所以当我回电话时,我不知道用户在做什么,可能会以借用而告终twice@kmdreko在迭代时删除将很容易,但是它在迭代时会调用
,而lib user(回调实现者)可能会运行一个API fn,从而改变我正在迭代的数据结构,所以它会感到恐慌。