在下面的代码中,我试图通过调用一个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);
}
2条答案
按热度按时间c9qzyr3d1#
documentation for
Rc
表示:更多详情请参见module-level documentation。
上面写着:
这很困难,因为
Rc
通过只给出对它所 Package 的值的共享引用来保证内存安全,而这些共享引用不允许直接变异,我们需要将我们希望变异的值的一部分 Package 在RefCell
中,RefCell
提供了 * 内部可变性 *:通过共享引用实现可变性的方法。RefCell
在运行时强制执行Rust的借用规则。然后演示如何使用它。
如果您没有阅读API文档,您可能会选择阅读 * The Rust Programming Language * 中的整个chapter about
Rc
。通过不可变引用,
Rc<T>
允许你在程序的多个部分之间共享只读数据,如果Rc<T>
也允许你有多个可变引用,你可能会违反第4章讨论的借用规则之一:对同一个地方的多个可变借用可能会导致数据竞争和不一致。但是能够改变数据是非常有用的!在下一节中,我们将讨论内部可变性模式和RefCell<T>
类型,您可以将其与Rc<T>
结合使用以处理此不变性限制。将这些新知识应用到您的代码中:
另见:
我正在使用
get_mut
函数你不太可能想用这个。
另见:
sqougxex2#
这不一定是OP的问题,但是一个可能导致
Rc<RefCell<X>>
问题的巨大陷阱可以追溯到BorrowMut
特征。如果遇到在
Rc<RefCell<X>>
上调用.borrow_mut()
返回另一个Rc<RefCell<X>>
的问题,请确保脚本顶部没有使用BorrowMut
trait。Rust-Analyzer会自动添加它,并且它完全改变了那个函数的行为。我是在调试了很多小时之后偶然发现this issue的。