Rc<RefCell<T>> 和 RefCell<Rc<T>> 有什么区别?

Gma*_*man 16 smart-pointers rust interior-mutability

Rust 文档涵盖的范围Rc<RefCell<T>>非常广泛,但没有RefCell<Rc<T>>涉及我现在遇到的 。

这些是否有效地给出了相同的结果?它们之间有重要区别吗?

Pet*_*all 17

这些是否有效地给出了相同的结果?

它们非常不同。

Rc是一个具有共享所有权的指针,同时RefCell提供内部可变性。它们的组成顺序对它们的使用方式有很大的不同。

通常,您将它们组合为Rc<RefCell<T>>; 整个事情都是共享的,每个共享的所有者都可以改变内容。Rc由于内部数据是共享的,因此外部的所有共享所有者都可以看到更改内容的效果。

您不能通过RefCell<Rc<T>>引用共享一个except,因此此配置在如何使用方面受到更多限制。为了改变内部数据,您需要从外部可变地借用RefCell,但随后您就可以访问不可变的 Rc. 改变它的唯一方法是用完全不同的Rc. 例如:

let a = Rc::new(1);
let b = Rc::new(2);

let c = RefCell::new(Rc::clone(&a));
let d = RefCell::new(Rc::clone(&a));

*d.borrow_mut() = Rc::clone(&b); // this doesn't affect c
Run Code Online (Sandbox Code Playgroud)

有没有办法突变中的值ab。这似乎远没有Rc<RefCell<T>>.

  • 当您有一台 Rc,而我想用另一台 Rc 替换它时,就会出现这种情况。原始 Rc 的所有克隆都不会受到影响。 (4认同)
  • 我真的很喜欢你展示 `RefCell&lt;Rc&lt;T&gt;&gt;` 如何工作的方式。这是一个很好的答案。 (2认同)