rust 在RC Package 的对象中调用可变方法的标准方法是什么?

au9on6nz  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(105)

在下面的代码中,我试图通过调用一个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);
}
c9qzyr3d

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>结合使用以处理此不变性限制。
将这些新知识应用到您的代码中:

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函数
你不太可能想用这个。
另见:

sqougxex

sqougxex2#

这不一定是OP的问题,但是一个可能导致Rc<RefCell<X>>问题的巨大陷阱可以追溯到BorrowMut特征。
如果遇到在Rc<RefCell<X>>上调用.borrow_mut()返回另一个Rc<RefCell<X>>的问题,请确保脚本顶部没有使用BorrowMut trait。
Rust-Analyzer会自动添加它,并且它完全改变了那个函数的行为。我是在调试了很多小时之后偶然发现this issue的。

相关问题