Struct Rust:借用结构实例,因为可变多次失败,即使使用了作用域

Struct Rust:借用结构实例,因为可变多次失败,即使使用了作用域,struct,rust,mutable,borrow-checker,borrowing,Struct,Rust,Mutable,Borrow Checker,Borrowing,我试图创建一个结构,它包含一个hashmap和一个vector,因此vector应该包含对hashmap中的值的引用 我认为在同一个实例上进行多个可变借用是可能的,只要将其放入独立的实例中 () 使用std::collections::HashMap; 结构容器 } 恳求{ pub fn new()->Self{ 容器{ 映射:HashMap::new(), vec:vec::new() } } 发布fn添加链接(&'a mut self,key:&str){ 如果让一些(值)=self.map

我试图创建一个结构,它包含一个hashmap和一个vector,因此vector应该包含对hashmap中的值的引用

我认为在同一个实例上进行多个可变借用是可能的,只要将其放入独立的实例中

()

使用std::collections::HashMap;
结构容器
}
恳求{
pub fn new()->Self{
容器{
映射:HashMap::new(),
vec:vec::new()
}
}
发布fn添加链接(&'a mut self,key:&str){
如果让一些(值)=self.map.get(键){
自我向量推送(值);
}
}
发布fn打印工具(&self){
println!((“Vec:{:?}”,self.Vec);
}
}
fn main(){
让mut container=container::new();
{
container.map.insert(“a.to_string(),“x.to_string());
}
{
container.map.insert(“b.to_string(),“y.to_string());
}
{
container.map.insert(“c.to_string(),“z.to_string());
}
{
容器。添加链接(“c”);
}
{
容器。添加链接(“a”);
}
{
容器。添加链接(“c”);
}
{
容器。添加链接(“k”);
}
container.print_vec();
}
我希望输出为:
Vec:[“z”、“x”、“z”]

tl;博士 实现自引用结构并非易事。

正如@SCappella所提到的,已经有了更详细的方法来解决这个问题


我解决这个问题的方法是绕过最初的问题,将容器结构拆分为两个独立的结构,其中引用结构与拥有数据的结构分开

()

使用std::collections::HashMap;
结构容器{
map:HashMap,
}
结构依赖容器,
}
impl容器{
pub fn new()->Self{
容器{
映射:HashMap::new(),
}
}
发布fn添加(&mut self,键:&str,值:&str){
self.map.insert(key.to_string(),value.to_string());
}
}
恳求{
pub fn new()->Self{
从属容器{
vec:vec::new()
}
}
发布fn添加链接(&mut self,container:&a container,key:&str){
如果let Some(value)=container.map.get(key){
自我向量推送(值);
}
}
发布fn打印工具(&self){
println!((“Vec:{:?}”,self.Vec);
}
}
fn main(){
让mut container=container::new();
让mut dep_container=DependentContainer::new();
容器。添加(“a”、“x”);
容器。添加(“b”、“y”);
容器。添加(“c”、“z”);
dep_container.添加链接(&container,“c”);
副容器。添加链接(&container,“a”);
dep_container.添加链接(&container,“c”);
dep_container.添加链接(&container,“k”);
dep_container.print_vec();
}
tl;博士 实现自引用结构并非易事。

正如@SCappella所提到的,已经有了更详细的方法来解决这个问题


我解决这个问题的方法是绕过最初的问题,将容器结构拆分为两个独立的结构,其中引用结构与拥有数据的结构分开

()

使用std::collections::HashMap;
结构容器{
map:HashMap,
}
结构依赖容器,
}
impl容器{
pub fn new()->Self{
容器{
映射:HashMap::new(),
}
}
发布fn添加(&mut self,键:&str,值:&str){
self.map.insert(key.to_string(),value.to_string());
}
}
恳求{
pub fn new()->Self{
从属容器{
vec:vec::new()
}
}
发布fn添加链接(&mut self,container:&a container,key:&str){
如果let Some(value)=container.map.get(key){
自我向量推送(值);
}
}
发布fn打印工具(&self){
println!((“Vec:{:?}”,self.Vec);
}
}
fn main(){
让mut container=container::new();
让mut dep_container=DependentContainer::new();
容器。添加(“a”、“x”);
容器。添加(“b”、“y”);
容器。添加(“c”、“z”);
dep_container.添加链接(&container,“c”);
副容器。添加链接(&container,“a”);
dep_container.添加链接(&container,“c”);
dep_container.添加链接(&container,“k”);
dep_container.print_vec();
}

我正在阅读这个答案,但我不太明白我必须在代码中修改什么才能使其正常工作。没有简单的答案。您试图做的并不是一个简单的问题(例如,如果
HashMap
必须重新分配,会发生什么?如前所述,这将使向量中的所有引用无效,这是不好的)。仔细阅读链接问题的答案,然后做出决定。我正在阅读这个答案,但我不太明白我必须在代码中修改什么才能使其工作。没有简单的答案。您试图做的并不是一个简单的问题(例如,如果
HashMap
必须重新分配,会发生什么?如前所述,这将使向量中的所有引用无效,这是不好的)。仔细阅读相关问题的答案,然后做出决定。
error[E0499]: cannot borrow `container` as mutable more than once at a time
  --> src/main.rs:44:9
   |
41 |         container.add_link("c");
   |         --------- first mutable borrow occurs here
...
44 |         container.add_link("a");
   |         ^^^^^^^^^
   |         |
   |         second mutable borrow occurs here
   |         first borrow later used here


(...)