interior-mutability
内部可变性:UnsafeCell、Cell、RefCell
UnsafeCell:打破共享不可变的唯一合法方式
- 标准库内部(如
Cell/RefCell/Mutex/RwLock)都以UnsafeCell<T>包装以支持在&T下修改内部数据。
Cell 与 Copy 语义
Cell<T>提供按值 get/set 的内部可变性,要求T: Copy(或使用take/replace)。
use std::cell::Cell;
let x = Cell::new(1);
x.set(2);
assert_eq!(x.get(), 2);
RefCell 与运行时借用检查
RefCell<T>提供borrow()/borrow_mut(),在运行时强制“多读或独写”的借用规则,违规触发 panic。
use std::cell::RefCell;
let v = RefCell::new(vec![1]);
{
let mut r = v.borrow_mut();
r.push(2);
}
assert_eq!(v.borrow().len(), 2);