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与内部可变性模式:https://blog.frognew.com/2020/07/rust-smart-pointers-refcell.html

    RUST内部可变性类型Cell/RefCell标准库源代码分析:https://zhuanlan.zhihu.com/p/514653328 如何理解Rust中的可变与不可变?:https://blog.51cto.com/u_15683898/5426816
    self as const UnsafeCell as const T as mut T 不安全 Rust 有两个被称为 裸指针raw pointers)的类似于引用的新类型。和引用一样,裸指针是不可变或可变的,分别写作 const Tmut T。这里的星号不是解引用运算符;它是类型名称的一部分。在裸指针的上下文中,*不可变 意味着指针解引用之后不能直接赋值。 裸指针与引用和智能指针的区别在于
    • 允许忽略借用规则,可以同时拥有不可变和可变的指针,或多个指向相同位置的可变指针
    • 不保证指向有效的内存
    • 允许为空
    • 不能实现任何自动清理功

    UnsafeCell

    std::cell::UnsafeCell,Rust内部可变性的核心原语。Cell<T>RefCell<T>的内部可变性是通过 UnsafeCell<T>来包装他们的内部数据。 UnsafeCell<T>类型是通过共享引用持有可变数据的唯一合法方式。源码如下:

    1. #[lang = "unsafe_cell"]
    2. #[stable(feature = "rust1", since = "1.0.0")]
    3. #[repr(transparent)]
    4. pub struct UnsafeCell<T: ?Sized> {
    5. value: T,
    6. }
    7. pub const fn get(&self) -> *mut T {
    8. self as *const UnsafeCell<T> as *const T as *mut T
    9. }

    get()方法,将一个值的不可变引用 (&self),强制转换三次:首先避免共享引用 (*const UnsafeCell<T>),其次是不变原生指针(*const T),然后是可变原生指针(*mut T),最后将其返回给调用者。