gpt4 book ai didi

rust - 如何创建包含对另一个 HashMap 元素的引用的 HashMap ?

转载 作者:行者123 更新时间:2023-11-29 07:51:27 26 4
gpt4 key购买 nike

我正在尝试创建一个包含两个散列图的结构 - 一个具有某些值,另一个引用另一个散列图的元素。这是我的代码。

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

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

error: result.first does not live long enough

我觉得这个问题和lifetime有关,但是我也说不清楚是哪里出了问题。

谁能解释发生了什么以及如何解决这个错误?

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

最佳答案

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

一般来说,在 Rust 中,不可能(安全地)在兄弟属性中获取引用;因此有.second点进.first是不可能的。

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

在这种情况下,可以通过简单地共享内存来避免最后一个障碍;例如,同时拥有 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>>,
}

然后维护实际的Foo别处的例子。如果您需要分配那些 Foo 的可能性同时保持 HashMap是使用竞技场分配,例如 Arena<Foo> .

关于rust - 如何创建包含对另一个 HashMap 元素的引用的 HashMap ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32232486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com