代码之家  ›  专栏  ›  技术社区  ›  ZNackasha

在Rc包装的对象中调用可变方法的标准方法是什么?

  •  0
  • ZNackasha  · 技术社区  · 6 年前

    在以下代码中,我尝试通过调用refcounted对象的一个方法来更改其值:

    use std::rc::Rc;
    
    fn main() {
        let mut x = Rc::new(Thing { num: 50 });
        x.what_to_do_to_get_mut_thing().change_num(19); //what do i do here
    }
    
    pub struct Thing {
        pub num: u32,
    }
    
    impl Thing {
        pub fn change_num(&mut self, newnum: u32) {
            self.num = newnum;
        }
    }
    

    get_mut

    if let Some(val) = Rc::get_mut(&mut x) {
        val.change_num(19);
    }
    
    1 回复  |  直到 6 年前
        1
  •  12
  •   Shepmaster Tim Diekmann    4 年前

    这个 documentation for Rc 说:

    module-level documentation 更多细节。

    这很难,因为 Rc 通过只提供对它包装的值的共享引用来加强内存安全,而这些引用不允许直接变异。我们需要将我们希望在 RefCell ,提供 内部可变性 RefCell

    然后演示如何使用它。


    如果您没有阅读API文档,那么您可能会选择阅读整个API文档 chapter about Rc Rust程序设计语言 . 它是这样说的:

    通过不可变的引用, Rc<T> Rc<T> 如果允许您也有多个可变引用,则可能会违反第4章中讨论的借用规则之一:多个可变借用到同一位置可能会导致数据争用和不一致。但是能够变异数据是非常有用的!在下一节中,我们将讨论内部可变模式和 RefCell<T> Rc<T> 使用此不变性限制。


    use std::{cell::RefCell, rc::Rc};
    
    fn main() {
        let x = Rc::new(RefCell::new(Thing { num: 50 }));
        x.borrow_mut().change_num(19);
    }
    

    另请参见:

    我用的是 get_mut

    你不太可能想用这个。

    另请参见: