我正在尝试制作一个包含两个哈希图的结构-一个具有一些值,一个引用另一个哈希图的元素。这是我的代码。
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结构Foo
和Bar
来自库,所以我不能修改这些结构。
该问题确实与所有权/借款/生命周期有关。
通常,在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>
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句