【发布时间】: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/…