如何解决无法修改递归结构中的字段
我有一个递归结构,其中结构的字段是对相同类型的其他结构的引用:
use std::collections::HashMap;
pub struct RecursiveStruct<'a> {
outer: Option<Box<&'a RecursiveStruct<'a>>>,dict: HashMap<u32,String>
}
有了这个结构,我也有几个方法,比如构造函数、将 (k,v) 对添加到 calee 的字段和一个 getter 的方法:
impl<'a> RecursiveStruct<'a> {
pub fn new(outer: Option<Box<&'a RecursiveStruct<'a>>>) -> Self {
let dict: HashMap<u32,String> = HashMap::new();
RecursiveStruct { outer,dict }
}
// searches for value corresponding to key in all struct layers
pub fn get(&self,key: u32) -> Result<String,()> {
let item = self.dict.get(&key);
match item {
Some(x) => Ok(x.clone()),None => {
match &self.outer {
Some(x) => x.get(key),None => Err(())
}
}
}
}
// adds (key,val) to "innermost" instance of struct
pub fn add(&mut self,key:u32,val: String) {
self.dict.insert(key,val);
}
}
这些方法工作正常,但是当我尝试添加一个方法来尝试修改任何内层中的 dict
字段时,我收到 cannot borrow '***x' as mutable,as it is behind a '&' reference
错误。
pub fn re_assign(&mut self,key: u32,val: String) {
if self.dict.contains_key(&key) {
self.dict.insert(key,val);
} else {
match &mut self.outer {
Some(x) => x.re_assign(key,val.clone()),None => println!("Such key Couldn't be found!"),};
}
}
这是去游乐场的link。
解决方法
您正在使用 &,但想要一个 &mut,默认情况下,rust 引用是不可变的: 游乐场:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=be82b8ba01dff60e106af9e59df8228e
use std::collections::HashMap;
pub struct RecursiveStruct<'a> {
outer: Option<Box<&'a mut RecursiveStruct<'a>>>,dict: HashMap<u32,String>
}
impl<'a> RecursiveStruct<'a> {
pub fn new(outer: Option<Box<&'a mut RecursiveStruct<'a>>>) -> Self {
let dict: HashMap<u32,String> = HashMap::new();
RecursiveStruct { outer,dict }
}
pub fn get(&self,key: u32) -> Result<String,()> {
let item = self.dict.get(&key);
match item {
Some(x) => Ok(x.clone()),None => {
match &self.outer {
Some(x) => x.get(key),None => Err(())
}
}
}
}
pub fn re_assign(&mut self,key: u32,val: String) {
if self.dict.contains_key(&key) {
self.dict.insert(key,val);
} else {
match &mut self.outer {
Some(x) => x.re_assign(key,val.clone()),None => println!("Such key couldn't be found!"),};
}
}
pub fn add(&mut self,key:u32,val: String) {
self.dict.insert(key,val);
}
}
fn main() {
// instantiate "outer" struct and set its field
let mut S = RecursiveStruct::new(None);
S.add(42,"Answer to the universe!".to_string());
// instantiate "inner" struct
let mut S1 = RecursiveStruct::new(Some(Box::new(&mut S)));
println!("{}",S1.get(42).unwrap()); // get the field of outer struct
// modify the field of outer struct
S1.re_assign(42,"The answer has been changed.".to_string());
println!("{}",S1.get(42).unwrap());
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。