https://mp.weixin.qq.com/s/OdcLb5U8QCeYH08feThN7w
Cell/RefCell source code: https://zhuanlan.zhihu.com/p/384388192
Rc source code: https://zhuanlan.zhihu.com/p/382299103
RefCell
self as const UnsafeCell
- 允许忽略借用规则,可以同时拥有不可变和可变的指针,或多个指向相同位置的可变指针
- 不保证指向有效的内存
- 允许为空
- 不能实现任何自动清理功
UnsafeCell
std::cell::UnsafeCell
,Rust内部可变性的核心原语。Cell<T>
和 RefCell<T>
的内部可变性是通过 UnsafeCell<T>
来包装他们的内部数据。 UnsafeCell<T>
类型是通过共享引用持有可变数据的唯一合法方式。源码如下:
#[lang = "unsafe_cell"]
#[stable(feature = "rust1", since = "1.0.0")]
#[repr(transparent)]
pub struct UnsafeCell<T: ?Sized> {
value: T,
}
pub const fn get(&self) -> *mut T {
self as *const UnsafeCell<T> as *const T as *mut T
}
其 get()
方法,将一个值的不可变引用 (&self)
,强制转换三次:首先避免共享引用 (*const UnsafeCell<T>)
,其次是不变原生指针(*const T)
,然后是可变原生指针(*mut T)
,最后将其返回给调用者。