RefCell是什么
Cell
use std::cell::RefCell;
fn main() {
let s = RefCell::new(String::from("hello, world"));
let s1 = s.borrow();
let s2 = s.borrow_mut();
println!("{},{}", s1, s2);
}
//运行时报错 不可变跟可变不能同时存在. 但是不是在编译器报错.等于是延迟了报错
RefCell简单总结
- 与Cell用于Copy的值不同,RefCell用于引用
- RefCell只是将借用规则从编译器推迟到程序运行期,并不能绕过规则
- RefCell适用于编译器误报或者一个引用被在多处代码使用 修改以至于南与管理借用关系时
- 使用RefCell时,违背借用规则会导致运行期的panic
选择Cell还是RefCell
- cell 只适用于copy类型 用于提供值,而RefCell用于提供引用
- Cell 不会panic 而Refcell会
性能比较
- Cell没有额外的性能开销
- Refcell 其实是由一些运行开销的,原因时它包含了一个字大小的”借用大小的状态”指示器,该指示器在每次运行的时借用时都会被修改,进而产生一点开销.
使用
use std::cell::RefCell;
fn main() {
let x = RefCell::new(6);
let mut a = x.borrow_mut();
*a = 7;
drop(a);
println!("{:?}", x);//RefCell { value: 7 }
}