在下面的代码中,我试图通过调用对象的方法之一来更改已计数对象的值:
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);
}
答案 0 :(得分:3)
有关更多详细信息,请参见module-level documentation。
具有以下文字:
这很困难,因为
Rc
仅通过给出对其包装的值的共享引用来增强内存安全性,而这些引用不允许直接突变。我们需要将希望突变的部分值包装在RefCell
中,该变量提供了内部可变性:一种通过共享引用实现可变性的方法。RefCell
在运行时强制执行Rust的借用规则。
然后演示如何使用它。
如果您没有阅读API文档,则可以选择阅读 Rust编程语言中的整个chapter about Rc
。它的意思是:
通过不可变的引用,
Rc<T>
允许您在程序的多个部分之间共享数据,以供只读。如果Rc<T>
也允许您具有多个可变引用,则您可能违反了第4章中讨论的借用规则之一:到同一位置的多个可变借用可能导致数据争用和不一致。但是能够变异数据非常有用!在下一部分中,我们将讨论内部可变性模式和RefCell<T>
类型,您可以将其与Rc<T>
结合使用以解决这种不变性限制。
将此新知识应用于您的代码:
use std::cell::RefCell;
use std::rc::Rc;
fn main() {
let x = Rc::new(RefCell::new(Thing { num: 50 }));
x.borrow_mut().change_num(19);
}
另请参阅:
我正在使用
get_mut
函数
您不太可能要使用它。
另请参阅: