首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从parking_lot::RwLock返回映射数据

从parking_lot::RwLock返回映射数据
EN

Stack Overflow用户
提问于 2020-02-28 13:02:00
回答 1查看 297关注 0票数 1

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

代码语言:javascript
复制
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的终身错误。是否有一种方法来修改代码,使它是健全的,并通过借用检查?

错误是:

代码语言:javascript
复制
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>>`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-28 18:11:10

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

代码语言:javascript
复制
impl S {
    fn f(&self, i: usize) -> Option<MappedRwLockReadGuard<'_, String>> {
        RwLockReadGuard::try_map(self.v.read(), |unlocked| unlocked.get(i)).ok()
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60452298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档