我有一个类似于这样的结构:
pub struct MyStruct {
data: Arc<Mutex<HashMap<i32, Vec<i32>>>>,
}
我可以轻松地获取互斥锁并查询底层的
HashMap
:let d = s.data.lock().unwrap();
let v = d.get(&1).unwrap();
println!("{:?}", v);
现在我想要创建一个方法来封装查询,所以我写了以下内容:
impl MyStruct {
pub fn get_data_for(&self, i: &i32) -> &Vec<i32> {
let d = self.data.lock().unwrap();
d.get(i).unwrap()
}
}
这段代码无法编译,因为我试图返回一个指向 Mutex
下数据的引用:
error: `d` does not live long enough
--> <anon>:30:9
|
30 | d.get(i).unwrap()
| ^
|
note: reference must be valid for the anonymous lifetime #1 defined on the block at 28:53...
--> <anon>:28:54
|
28 | pub fn get_data_for(&self, i: &i32) -> &Vec<i32> {
| ^
note: ...but borrowed value is only valid for the block suffix following statement 0 at 29:42
--> <anon>:29:43
|
29 | let d = self.data.lock().unwrap();
| ^
我可以通过将
HashMap
的值包装在Arc
中来修复它,但这看起来很丑(Arc
中的Arc
)并且使代码变得复杂:pub struct MyStruct {
data: Arc<Mutex<HashMap<i32, Arc<Vec<i32>>>>>,
}
什么是最佳方法来解决这个问题?是否可能创建一个方法,可以在不修改数据结构的情况下实现我的要求? 完整示例代码。
MutexGuard
上有一个map()
方法,就像Ref::map()
一样... 为什么没有呢? - Lukas Kalbertodtderef()
时都会进行查找。我认为在安全的Rust中无法做得更好。但我很想被证明是错误的。 - Lukas Kalbertodtstruct{MutexGuard<'a>,&'a Inner}
,并且还需要一个deref(_mut)
和map
方法。这样可以在安全的 Rust 中实现任意重映射而无需每次等待锁。 - Linear