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

标签 rust smart-pointers interior-mutability

Rust 文档涵盖 Rc<RefCell<T>>相当广泛,但不涉及 RefCell<Rc<T>> ,我现在遇到了。

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

最佳答案

Do these effectively give the same result?

它们非常不同。

Rc是共享所有权的指针,而 RefCell提供内部可变性。它们的组成顺序对它们的使用方式有很大的影响。

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

您不能共享 RefCell<Rc<T>>除了引用,所以这个配置在如何使用方面受到更多限制。为了改变内部数据,您需要可变地从外部借用 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

无法改变 a 中的值和 b .这似乎远不如 Rc<RefCell<T>> 有用.

关于rust - Rc<RefCell<T>> 和 RefCell<Rc<T>> 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57487948/

相关文章:

rust - 为什么 Mutex 被设计为需要 Rust 中的 Arc

reference - `mut a: &T` 和 `a: &mut T` 有什么区别?

c++ - 为什么 boost::scoped_ptr 或 std::unique_ptr 不可复制?

c++ - 如何使用智能指针从文件中读取数据 block ?

rust - 如何读取和修改链接树中节点的值?

rust - 如何在不破坏封装的情况下返回对 RefCell 中某些内容的引用?

macros - 使用宏的输出作为另一个宏的参数

arrays - 如何使用 ndarray 从向量的向量创建二维数组?

string - 如何在 rust 中返回字符串向量

c++ - 模板别名 shared_ptr 和 unique_ptr 时是否有任何陷阱或限制?