Struct Rust:借用结构实例,因为可变多次失败,即使使用了作用域
我试图创建一个结构,它包含一个hashmap和一个vector,因此vector应该包含对hashmap中的值的引用 我认为在同一个实例上进行多个可变借用是可能的,只要将其放入独立的实例中 ()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
使用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
(...)