我正在尝试制作一个包含两个哈希图的结构-一个具有一些值,一个引用另一个哈希图的元素。这是我的代码。
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结构Foo和Bar来自库,所以我不能修改这些结构。
问题确实与所有权/借款/生命周期有关。
一般来说,在 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>.
| 归档时间: |
|
| 查看次数: |
1408 次 |
| 最近记录: |