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

mag

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

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() {
}

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

错误:result.first寿命不足

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

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

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

马修M.

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

通常,在Rust中,不可能(安全地)在同级属性中引用。因此不可能.second指出.first

但是,即使将其分为两个结构,也仍然会遇到问题,因为将引用作为HashMap借项来引用(这意味着只要引用有效,HashMap就禁止修改该引用),这可能不是您想要的。

在这种情况下,可以通过简单地共享内存来避免最后的障碍。例如,同时HashMap使用Rc<X>值代替X&'a X分别使用...

...但是,这对于根据FooBar<'a>类型提供的特定问题无济于事

您可以将结构更改为:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章