rust - 从parking_lot::RwLock返回映射的数据

标签 rust lifetime borrow

我的结构在parking_lot::RwLock中有一个向量,并且一个成员函数必须从该向量返回一个 protected 元素:

use parking_lot::*;

struct S {
    v: RwLock<Vec<String>>,
}

impl S {
    fn f(&self, i: usize) -> MappedRwLockReadGuard<'_, Option<&String>> {
        RwLockReadGuard::map(self.v.read(), |unlocked| &unlocked.get(i))
    }
}

(这是问题的简化核心,而不是实际代码)

该代码通过了类型检查,但是f出现了生命周期错误。
有没有一种方法可以修改代码,使其声音正确并通过借阅检查器?

错误是:

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
  --> src/lib.rs:9:66
   |
9  |         RwLockReadGuard::map(self.v.read(), |unlocked| &unlocked.get(i))
   |                                                                  ^^^
   |
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 9:45...
  --> src/lib.rs:9:45
   |
9  |         RwLockReadGuard::map(self.v.read(), |unlocked| &unlocked.get(i))
   |                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: ...so that reference does not outlive borrowed content
  --> src/lib.rs:9:57
   |
9  |         RwLockReadGuard::map(self.v.read(), |unlocked| &unlocked.get(i))
   |                                                         ^^^^^^^^
note: but, the lifetime must be valid for the anonymous lifetime #1 defined on the method body at 8:5...
  --> src/lib.rs:8:5
   |
8  | /     fn f(&self, i: usize) -> MappedRwLockReadGuard<'_, Option<&String>> {
9  | |         RwLockReadGuard::map(self.v.read(), |unlocked| &unlocked.get(i))
10 | |     }
   | |_____^
note: ...so that the expression is assignable
  --> src/lib.rs:9:9
   |
9  |         RwLockReadGuard::map(self.v.read(), |unlocked| &unlocked.get(i))
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   = note: expected  `lock_api::rwlock::MappedRwLockReadGuard<'_, _, std::option::Option<&std::string::String>>`
              found  `lock_api::rwlock::MappedRwLockReadGuard<'_, _, std::option::Option<&std::string::String>>`

最佳答案

解决方案是使用RwLockReadGuard::try_map()并将返回类型从MappedRwLockReadGuard<'_, Option<&_>>更改为Option<MappedRwLockReadGuard<'a, _>>:

impl S {
    fn f(&self, i: usize) -> Option<MappedRwLockReadGuard<'_, String>> {
        RwLockReadGuard::try_map(self.v.read(), |unlocked| unlocked.get(i)).ok()
    }
}

关于rust - 从parking_lot::RwLock返回映射的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60452298/

相关文章:

arrays - 如何在 Rust 中将切片作为数组获取?

audio - 从 Rust 中的多个音频流中并行获取大小相等的 block

c++ - 从函数返回的对象在不使用时是否仍然创建?

rust - 为什么没有发生借用重叠时会出现借用错误?

使用rust 错误 : borrow occurs after drop a mutable borrow

multithreading - 如何将 JoinHandle 存储在与自身运行的线程的结构中?

parallel-processing - 是否可以将 Rayon 和 Faster 结合起来?

c++ - 从函数返回本地声明的指针是否会导致它切换作用域?

reference - 如何为对结构的引用实现 Add 特性?

rust - 当类型为 `Copy` 时,方法是否应该 move (`self` ) 或借用 (`&self` ) 类型?