【问题标题】:How to get rid of "cannot return value referencing temporary value" error如何摆脱“无法返回引用临时值的值”错误
【发布时间】:2020-08-20 08:41:10
【问题描述】:

我正在尝试实现一种方法,该方法返回包含在 HashMap 中的结构的 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

【问题讨论】:

  • 恐怕不会,在我的示例中,函数不返回引用
  • 您的函数确实返回了一个引用,因为TradePairHandle 包含一个RwLockReadGuard,而RwLockReadGuard 又包含一个引用。但是,引用指向的值是在您的函数内部“创建”的,这并不完全准确。
  • 问题是外部锁,你在函数第一行抓取的那个,在从函数返回时会被释放,所以你从那个锁内部获得的任何引用都将变得无效到那时。
  • @SvenMarnach 好的,它是:stackoverflow.com/questions/63523566/…

标签: rust reference


【解决方案1】:

感谢 Sven Marnach,我用 owning_ref crate 尝试了不同的方法。现在 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())
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 2021-01-07
    • 2016-09-07
    • 1970-01-01
    • 2011-09-15
    • 2021-06-30
    相关资源
    最近更新 更多