如何摆脱“无法返回引用临时值的值”错误

问题描述

我正在尝试实现一种方法,该方法将包含在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())
}

并且编译没有错误。再次感谢!