如何从 RefCell 返回具有生命周期的引用?

问题描述 投票:0回答:1

例如,我有以下结构:

struct MyStruct {
    items: RefCell<HashMap<i32, SomeStruct>>,
}

impl MyStruct {
    fn new() -> Self {
        Self {
            items: RefCell::new(HashMap::new()),
        }
    }

    fn get_item(&self, key: &i32) -> Option<&SomeStruct> {
        let items = self.items.borrow();
        items.get(key)
    }
}

由于生命周期不同,该代码将无法编译。所以,我尝试介绍这些生命周期:

    fn get_item<'a>(&'a self, key: &i32) -> Option<&'a SomeStruct> {
        let items = self.items.borrow();
        items.get(key)
    }

但是它什么也没解决。

在这种情况下是否可以返回

Option<&'a SomeStruct>
或类似类型?

rust reference borrow-checker
1个回答
0
投票

正如评论中提到的,您无法返回引用,因为它会比函数中创建的

Ref
寿命更长,并且允许多次借用。要返回可选的
Ref
,您可以使用
Ref::filter_map()
,如下所示:

fn get_item(&self, key: &i32) -> Option<Ref<'_, SomeStruct>> {
    let items = self.items.borrow();
    Ref::filter_map(items, |items| items.get(key)).ok()
}

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.