繁体   English   中英

参考单元<refcell<> &gt; 不会改变

[英]refcell rc<refcell<>> doesn't change

这是我的简化代码。 我需要在函数中更改 pdp_state。 但状态仍然是“a”。 我不明白为什么克隆 Rc 不起作用。 我还检查了这个克隆的结构,它可以工作。

#[derive(Clone,Copy)]
enum PDPStatus{
    a,
    b
}
struct network{
    pdp_state:Rc<RefCell<PDPStatus>>,
}
impl network{
    fn set(&mut self){
        let mut t = *self.pdp_state.clone().borrow_mut();
        match t {
            a => {let m1 = self.pdp_state.clone();
                let mut a = (*m1).borrow_mut() ;
                *a = PDPStatus::b;
                println!("a");},
            b=> {let m1 = self.pdp_state.clone();m1.replace( PDPStatus::a);
                println!("b");},
        };

    }
}
fn main() {
    let mut network1 = network::new();
    network1.set();
    network1.set();
    network1.set();
    network1.set();
}

更新:我的 set 函数看起来像这样。 我需要两个可以访问 pdp_state 的闭包。 我将这些闭包作为回调传递。 我相信这些闭包不会一起调用。

    fn set(&mut self){
        let borrowed_pdp_status = self.pdp_state.borrow().clone();
        match borrowed_pdp_status {
            PDPStatus::a => {
                let mut state = self.pdp_state.clone();
                let mut closuree = || state =  Rc::new(RefCell::new(PDPStatus::b));
                let mut state1 = self.pdp_state.clone();
                let mut closuree1 = || state1 = Rc::new(RefCell::new(PDPStatus::b));

                closuree();
                closuree1();
                println!("a");
            },
            PDPStatus::b => {
                let mut closuree = || self.pdp_state = Rc::new(RefCell::new(PDPStatus::a));
                closuree();
                println!("b");
            },
        };
    }

set方法中,需要borrow self.pdp_state然后clone()到一个变量中,然后匹配你克隆到的变量。

set方法替换为:

fn set(&mut self) {
        let borrowed_pdp_status = self.pdp_state.borrow().clone();
        match borrowed_pdp_status {
            PDPStatus::a => {
                self.pdp_state = Rc::new(RefCell::new(PDPStatus::b));
                println!("a");
            },
            PDPStatus::b => {
                self.pdp_state = Rc::new(RefCell::new(PDPStatus::a));
                println!("b");
            },
        };
}

游乐场链接 - https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=426d4cb7db9a92ee4ddcd4f36dbc12f7

这个答案是在问题更新后发布的:

编辑

您可以使用RefCellreplace()方法

fn set(&mut self) {
    let borrowed_pdp_status = self.pdp_state.borrow().clone();
    match borrowed_pdp_status {
        PDPStatus::a => {
            let mut closuree = || {
                self.pdp_state.replace(PDPStatus::b);
            };
            let mut closuree1 = || {
                self.pdp_state.replace(PDPStatus::b);
            };

            closuree();
            closuree1();
            println!("a");
        }
        PDPStatus::b => {
            let mut closuree = || {
                self.pdp_state.replace(PDPStatus::a);
            };
            closuree();
            println!("b");
        }
    };
}

游乐场链接 - https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=4af02228d58b2f2c865a525e3f70d6a0

老的

你可以让闭包以&mut self.pdp_state作为参数,然后更新它。

fn set(&mut self) {
    let borrowed_pdp_status = self.pdp_state.borrow().clone();
    match borrowed_pdp_status {
        PDPStatus::a => {
            let mut closuree = |local_pdp_state: &mut Rc<RefCell<PDPStatus>>| {
                *local_pdp_state = Rc::new(RefCell::new(PDPStatus::b))
            };
            let mut closuree1 = |local_pdp_state: &mut Rc<RefCell<PDPStatus>>| {
                *local_pdp_state = Rc::new(RefCell::new(PDPStatus::b))
            };

            closuree(&mut self.pdp_state);
            closuree1(&mut self.pdp_state);
            println!("a");
        }
        PDPStatus::b => {
            let mut closuree = |local_pdp_state: &mut Rc<RefCell<PDPStatus>>| {
                *local_pdp_state = Rc::new(RefCell::new(PDPStatus::a))
            };
            closuree(&mut self.pdp_state);
            println!("b");
        }
    };
}

游乐场链接 - https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=4af96385b0446082afdb7d615bb8eecb

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM