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/