Rust 使用HashMap引用作为值的HashMap的生存期问题

Rust 使用HashMap引用作为值的HashMap的生存期问题,rust,rust-lifetimes,Rust,Rust Lifetimes,(仅供参考,新铁锈!) 所以-我一直在尝试在铁锈中摸索生命的概念。我已经阅读了文档,读了一些博客和关于这个主题的帖子。但仍然没有完全理解(因此,这个问题的标题可能不好) 我有一个特别的问题,我正试图找出,我已经归结为这个小样本代码(试图使尽可能接近一个工作样本): 使用std::collections::HashMap; //假设这实际上是一种更复杂的类型: 类型BigComplexType=i32; fn一些昂贵的计算()->BigComplexType{ //想象一下,这需要一些争论,并且需

(仅供参考,新铁锈!)

所以-我一直在尝试在铁锈中摸索生命的概念。我已经阅读了文档,读了一些博客和关于这个主题的帖子。但仍然没有完全理解(因此,这个问题的标题可能不好)

我有一个特别的问题,我正试图找出,我已经归结为这个小样本代码(试图使尽可能接近一个工作样本):

使用std::collections::HashMap;
//假设这实际上是一种更复杂的类型:
类型BigComplexType=i32;
fn一些昂贵的计算()->BigComplexType{
//想象一下,这需要一些争论,并且需要很长时间才能运行
返回123;
}
fn construct()->HashMap lifetime\u return.rs:29:12
|
19 |主插入件(10,&嵌套);
|----'nested'在这里借用
...
29 |回流总管;
|^^^^返回一个值,该值引用当前函数拥有的数据
错误[E0515]:无法返回引用局部变量“嵌套”的值`
-->终生返回。rs:29:12
|
20 |主插入件(20,&嵌套);
|----'nested'在这里借用
...
29 |回流总管;
|^^^^返回一个值,该值引用当前函数拥有的数据
错误:由于之前的两个错误而中止
有关此错误的详细信息,请尝试“rustc--explain E0515”。

任何/所有帮助都将不胜感激!我试图寻找类似的问题,但找不到一个——也许我只是没有意识到一些所谓的帖子是重复的,因为我还没有完全理解生命周期模型。

你的直觉是正确的:嵌套的
只在
构造中存在,并且您尝试在hashmap中返回对它的引用,这些引用的有效期比函数的有效期长。假设您不想克隆嵌套贴图,可能是因为它们非常大,您可以使用以下方法来替代对嵌套贴图进行简单可克隆的引用,以使它们在必要时保持活动状态:

使用std::collections::HashMap;
使用std::rc::rc;
类型BigComplexType=i32;
fn一些昂贵的计算()->BigComplexType{
返回123;
}
fn construct()->HashMap{
让mut main=HashMap::new();
让mut nested=HashMap::new();
insert(1111,一些昂贵的计算());
insert(2222,一些昂贵的计算());
让嵌套的_rc=rc::new(嵌套);
main.insert(10,Rc::clone(&nested_-Rc));
main.insert(20,嵌套的_rc);//可以为最后一次插入移动rc
让mut nested2=HashMap::new();
nested2.insert(3333,一些昂贵的计算());
nested2.insert(4444,一些昂贵的计算());
设nested2_rc=rc::new(nested2);
main.insert(30,Rc::clone(&nested2_Rc));
主插件(40,嵌套2_rc);
回水总管;
}
fn main(){
设map=construct();
println!(“{}”,map[&10][&1111]);//123
}

太棒了!这正是我想要的!我正准备构建自己的容器来尝试并实现这一点——但是这个def。干得好,谢谢!