RefCell是什么

Cell 必须是实现了copy的特征的值类型,RefCell是引用

  1. use std::cell::RefCell;
  2. fn main() {
  3. let s = RefCell::new(String::from("hello, world"));
  4. let s1 = s.borrow();
  5. let s2 = s.borrow_mut();
  6. println!("{},{}", s1, s2);
  7. }
  8. //运行时报错 不可变跟可变不能同时存在. 但是不是在编译器报错.等于是延迟了报错

RefCell简单总结

  • 与Cell用于Copy的值不同,RefCell用于引用
  • RefCell只是将借用规则从编译器推迟到程序运行期,并不能绕过规则
  • RefCell适用于编译器误报或者一个引用被在多处代码使用 修改以至于南与管理借用关系时
  • 使用RefCell时,违背借用规则会导致运行期的panic

选择Cell还是RefCell

  • cell 只适用于copy类型 用于提供值,而RefCell用于提供引用
  • Cell 不会panic 而Refcell会

性能比较

  • Cell没有额外的性能开销
  • Refcell 其实是由一些运行开销的,原因时它包含了一个字大小的”借用大小的状态”指示器,该指示器在每次运行的时借用时都会被修改,进而产生一点开销.

使用

  1. use std::cell::RefCell;
  2. fn main() {
  3. let x = RefCell::new(6);
  4. let mut a = x.borrow_mut();
  5. *a = 7;
  6. drop(a);
  7. println!("{:?}", x);//RefCell { value: 7 }
  8. }