问题描述
我正在尝试实现一种方法,该方法将包含在HashMap中的objext的RwLockReadGuard(自身返回到RwLock)
以下功能:
pub fn get_pair<'a>(&self,name: &str) -> Option<TradePairHandle> {
if let Ok(ref pair) = self.pairs.read() {
if let Some(p) = pair.get(name) {
if let Ok(r) = p.read() {
Some(TradePairHandle::new(r))
} else {
None
}
} else {
None
}
} else {
None
}
}
引发以下编译错误:
error[E0515]: cannot return value referencing temporary value
--> src/lib.rs:76:21
|
73 | if let Ok(ref pair) = self.pairs.read() {
| ----------------- temporary value created here
...
76 | Some(TradePairHandle::new(r))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ returns a value
引用当前函数拥有的数据
如何正确执行此操作?
有完整的Rust playground
解决方法
多亏了Sven Marnach,我用owning_ref
的木箱尝试了另一种方法。现在,方法get_pair如下所示:
pub fn get_pair<'a,'me: 'a>(
&'me self,name: &str,) -> RwLockReadGuardRef<'a,TradePairHashMap,Arc<RwLock<TradePair>>> {
RwLockReadGuardRef::new(self.pairs.read().unwrap()).map(|pairs| pairs.get(name).unwrap())
}
并且编译没有错误。再次感谢!