我有一个类型的对象
Arc<RwLock<SessionData>>
我有一种方法应该参考SessionData
fn some_method(session: ...)
我正在使用 Rocket(Rust 的网络框架),我不能直接调用该方法,因为它是由 Rocket 调用的。但是,我可以为它提供一个实现,该实现创建将传递给处理程序的对象。它看起来有点像这样:
impl<'a, 'r> request::FromRequest<'a, 'r> for SomeType {
type Error = ();
fn from_request(request: &'a request::Request<'r>) -> request::Outcome<Self, Self::Error> {
// return object here
}
}
我想避免RwLock
直接返回一个,因为我希望处理程序将一个已经锁定的对象传递给它。但是,我不能返回引用或 a RwLockReadGuard
,因为它们都依赖于RwLock
,这将超出范围。
相反,我正在尝试创建某种自给自足的类型,该类型将包含一个Arc<RwLock<SessionData>>
,包含对该锁的锁定保护,并取消对一个SessionData
对象的引用。
到目前为止,我已经尝试了以下一些组合:
Session
包含 anArc<RwLock<SessionData>>
和 a的对象RwLockReadGuard<SessionData>
- 包含来自owning-ref库的 an
Arc<RwLock<SessionData>>
和 a的对象。RwLockReadGuardRef<SessionData>
- 将使用
OwnedHandle
来自owning-ref库的类型的对象。
然而,我一直没能做我想做的事,遇到各种终生借贷问题等等。
是否有可能创建一种自包含的类似“句柄”的对象,该对象将同时包含它指向的对象的锁和锁守卫?
这与如何返回对位于互斥锁下的值的子值的引用中描述的情况类似,但略有不同?. 在那里,MutexGuardRef
内部依赖于,如果(or ) 超出范围Mutex
,则不存在。为了实现类似的行为,我必须传递一个包含 my 的结构,然后在方法内部进行锁定。这很好,但我想知道我是否可以更进一步,并传递一个既独立又用作a 的结构,从而避免手动锁定的需要。Mutex
MyStruct
RwLock
RwLockGuard
基本上,我想将锁定RwLock
从客户端移动到值的提供者。