RefCell
相较于Cell,并不需要数据实现 Copy 特征,而用于引用。
RefCell
只是将借用规则从编译期推迟到程序运行期,并不能绕过这个规则。
RefCell
适用于编译期误报或者一个引用被在多处代码使用、修改以至于难于管理借用关系时。
使用 RefCell
时,违背借用规则会导致运行期的 panic
。
与Rc组合使用
A common way to use RefCell<T>
is in combination with Rc<T>
. Recall that Rc<T>
lets you have multiple owners of some data, but it only gives immutable access to that data. If you have an Rc<T>
holding a RefCell<T>
, you can get a value with multiple owners and that you can mutate!
use std::cell::RefCell;
use std::rc::Rc;
fn main() {
let s = Rc::new(RefCell::new("我很善变,还拥有多个主人".to_string()));
let s1 = s.clone();
let s2 = s.clone();
s2.borrow_mut().push_str(", oh yeah!");
println!("{:?}\n{:?}\n{:?}", s, s1, s2);
}