微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法修改递归结构中的字段

如何解决无法修改递归结构中的字段

我有一个递归结构,其中结构的字段是对相同类型的其他结构的引用:

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?