rust - 在 Rc 包装的对象中调用可变方法的标准方法是什么?
问题描述
在下面的代码中,我试图通过调用其方法之一来更改引用对象的值:
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);
}
解决方案
的文档Rc
说:
有关更多详细信息,请参阅模块级文档。
其中有这样的文字:
这很困难,因为
Rc
通过仅提供对其包装的值的共享引用来强制内存安全,并且这些引用不允许直接突变。我们需要将我们希望改变的部分值包装在 a 中RefCell
,它提供了内部可变性:一种通过共享引用实现可变性的方法。RefCell
在运行时强制执行 Rust 的借用规则。
然后演示如何使用它。
如果你没有阅读 API 文档,你可能会选择阅读The Rust Programming Language中的整章Rc
。它有这样的说法:
通过不可变引用,
Rc<T>
您可以在程序的多个部分之间共享数据以供只读。如果Rc<T>
允许你也有多个可变引用,你可能会违反第 4 章中讨论的借用规则之一:多个可变借用到同一个地方会导致数据竞争和不一致。但是能够改变数据是非常有用的!在下一节中,我们将讨论内部可变性模式以及RefCell<T>
可以与 an 结合使用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);
}
也可以看看:
- 如何使用 Arc 在线程之间共享可变对象?
- Cell 或 RefCell 是最佳选择的情况
- Rc<RefCell<T>> 和 RefCell<Rc<T>> 有什么区别?
- 当我可以使用 Cell 或 RefCell 时,我应该选择哪个?
- 需要关于 Rust 的单元格和引用计数类型的整体解释
我正在使用该
get_mut
功能
您不太可能想使用它。
也可以看看:
推荐阅读
- three.js - Forge MeshPhong材质透明色
- javascript - 我需要在 Alpine.js 组件的初始化处触发“更改”事件
- twitter - 将推文转换为 .warc 格式
- ios - iOS table view diffable 数据源和预取
- java - Pomless Tycho 在 Eclipse 中构建,具有继承的 Maven 依赖项
- c++ - 使用模板和常量指针的函数重载
- jenkins - How do I replace a specific line in a file, using jenkins file build step?
- visual-studio-code - Visual Studio - Live Server extension brakes emmet
- php - Cashier (Stripe) integration in Lumen
- csv - How to remove comma from double quotes in perl