如何创建包含对另一个哈希图元素的引用的哈希图?

Yan*_*ang 5 rust

我正在尝试制作一个包含两个哈希图的结构-一个具有一些值,一个引用另一个哈希图的元素。这是我的代码。

use std::collections::HashMap;

struct Foo;
struct Bar<'s>(&'s Foo);

struct MyStruct<'a> {
    first : HashMap<&'a str, Foo>,
    second : HashMap<&'a str, Bar<'a>>,
}

impl<'a> MyStruct<'a> {
    fn new() -> MyStruct<'a> {
        let mut result = MyStruct {
            first : HashMap::new(),
            second : HashMap::new(),
        };
        match result.first.get("") {
            Some(t) => { result.second.insert("", Bar(t)); },
            None => {},
        }
        result
    }
}

fn main() {
}
Run Code Online (Sandbox Code Playgroud)

并且此代码无法编译,并出现以下错误:

错误:result.first寿命不足

我认为这个问题与一生有关,但是我无法清楚地解释出什么问题。

谁能解释正在发生的事情以及如何解决此错误?

PS结构FooBar来自库,所以我不能修改这些结构。

Mat*_* M. 5

问题确实与所有权/借款/生命周期有关。

一般来说,在 Rust 中,不可能(安全地)在同级属性中获取引用;因此,指出.second这一点.first是不可能的。

但是,即使您将其分成两个结构,您仍然会遇到问题,因为将引用放入 a 中会借用HashMap它(这意味着只要引用存在,就HashMap禁止修改 a),这可能不是您想要的。

在这种情况下,可以通过简单地共享内存来避免最后一个障碍;例如,分别HashMap使用一个Rc<X>值而不是X&'a X......

Foo...但是,鉴于和类型,这对解决您的特定问题没有帮助Bar<'a>

您可以将结构更改为:

struct MyStruct<'a, 'b> {
    first: HashMap<&'a str, &'b Foo>,
    second: HashMap<&'a str, Bar<'b>>,
}
Run Code Online (Sandbox Code Playgroud)

然后Foo在其他地方维护实际实例。如果您需要Foo在维护的同时分配这些资源,则HashMap可以使用竞技场分配,例如Arena<Foo>.