Rust RefCell
RefCell is a Rust’s smart pointer type to implement interior mutability. RefCell is single-threaded, and its multi-threaded alternative is Mutex.
With regular reference, we have & and mut & to borrow the underlying data. With RefCell, we use borrow and borrow_mut methods. borrow method returns a Ref<T>, and borrow_mut returns a RefMut<T>. RefCell<T> keeps track of how many Ref<T> and RefMut<T> instances are active at runtime.
Combine RefCell with Rc
RefCell is often combined with Rc. Rc only hold immutable values, we need to add RefCell change the values inside.
let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));
{
// note we limit the scope of this borrowing
let mut map: RefMut<'_, _> = shared_map.borrow_mut();
map.insert("africa", 92388);
map.insert("kyoto", 11837);
map.insert("piccadilly", 11826);
map.insert("marbles", 38);
}
let total: i32 = shared_map.borrow().values().sum();