内部可变性

有时,需要在具有多个别名的情况下修改类型。在 Rust 中,这可以通过一种称为“内部可变性”的模式来实现。如果一个类型的内部状态可以通过对其的共享引用进行更改,则该类型具有内部可变性。这与共享引用指向的值不能被修改的通常要求相违背。

std::cell::UnsafeCell<T> 类型是唯一允许禁用此要求的方法。当 UnsafeCell<T> 被不可变地别名时,修改或获取对其包含的 T 的可变引用仍然是安全的。与所有其他类型一样,拥有多个 &mut UnsafeCell<T> 别名是未定义的行为。

可以通过使用 UnsafeCell<T> 作为字段来创建具有内部可变性的其他类型。标准库提供各种类型,这些类型提供安全的内部可变性 API。例如,std::cell::RefCell<T> 使用运行时借用检查来确保有关多个引用的通常规则。std::sync::atomic 模块包含包装仅使用原子操作访问的值的类型,允许跨线程共享和修改该值。