25

Rust 文档涵盖了Rc<RefCell<T>>相当广泛的内容,但没有涉及到RefCell<Rc<T>>我现在遇到的 .

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

4

1 回答 1

32

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

它们非常不同。

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>>.

于 2019-08-05T23:47:40.323 回答