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

Gil*_*h22 0 rust

在下面的代码中,我试图通过调用其方法之一来更改已计数对象的值:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用该get_mut函数来实现此目的,但是我不知道这是否是实现此目标的标准方法。

if let Some(val) = Rc::get_mut(&mut x) {
    val.change_num(19);
}
Run Code Online (Sandbox Code Playgroud)

小智 10

这不一定是OP的问题,但可能导致问题的巨大陷阱Rc<RefCell<X>>可以追溯到该BorrowMut特征。

.borrow_mut()如果您遇到调用anRc<RefCell<X>>返回 another 的问题Rc<RefCell<X>>,请确保BorrowMut脚本顶部没有使用该特征。

Rust-Analyzer 会自动添加它,并完全改变该函数的行为。当我偶然发现这个问题时,我经过几个小时的调试才了解到这一点。


She*_*ter 5

对文件Rc说:

有关更多详细信息,请参见模块级文档

里面有这段文字:

这很困难,因为Rc通过仅给出对其包装的值的共享引用来增强内存安全性,而这些引用不允许直接突变。我们需要将希望突变的值的一部分包装在RefCell提供内部可变性的内,这是一种通过共享引用实现可变性的方法。RefCell在运行时强制执行Rust的借用规则。

然后演示了如何使用它。


如果你没看过的API文档,你可能会选择而不是读取整个约章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);
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:

我正在使用该get_mut功能

您不太可能要使用此功能。

也可以看看:


归档时间:

查看次数:

629 次

最近记录:

7 年,1 月 前