首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >refcell rc<refcell<>>未更改

refcell rc<refcell<>>未更改
EN

Stack Overflow用户
提问于 2021-07-11 13:14:48
回答 2查看 99关注 0票数 0

以下是我的简化代码。我需要更改函数中的pdp_state。但国家仍然是“a”。我不明白为什么克隆Rc不能工作。我还检查了这个克隆出了一个结构,并且它工作了。

代码语言:javascript
复制
#[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的闭包。我将这些闭包作为回调传递。我确信这些闭包不会一起调用。

代码语言:javascript
复制
    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");
            },
        };
    }
EN

回答 2

Stack Overflow用户

发布于 2021-07-11 13:51:57

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

set方法替换为以下内容:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2021-07-11 20:37:19

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

编辑

您可以使用RefCell中的replace()方法

代码语言:javascript
复制
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作为参数,然后对其进行更新。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68333385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档