Rust 文档涵盖了Rc<RefCell<T>>
相当广泛的内容,但没有涉及到RefCell<Rc<T>>
我现在遇到的 .
这些是否有效地给出了相同的结果?它们之间有重要的区别吗?
Rust 文档涵盖了Rc<RefCell<T>>
相当广泛的内容,但没有涉及到RefCell<Rc<T>>
我现在遇到的 .
这些是否有效地给出了相同的结果?它们之间有重要的区别吗?
这些是否有效地给出了相同的结果?
它们非常不同。
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
没有办法改变a
和中的值b
。这似乎远不如Rc<RefCell<T>>
.