内部可变性
有时,一个类型需要在拥有多个别名时被修改。在 Rust 中,这是通过一种称为内部可变性的模式来实现的。
如果一个类型的内部状态可以通过对它的共享引用来改变,那么这个类型就具有内部可变性。
这违反了通常的要求,即共享引用所指向的值不能被修改。
std::cell::UnsafeCell<T>
类型是唯一允许禁用此要求的类型。当 UnsafeCell<T>
被不可变地别名化时,仍然可以安全地修改它包含的 T
,或者获取其可变引用。
与所有其他类型一样,拥有多个 &mut UnsafeCell<T>
别名是未定义行为。
其他具有内部可变性的类型可以通过使用 UnsafeCell<T>
作为字段来创建。标准库提供各种类型的安全内部可变性 API。
例如,std::cell::RefCell<T>
使用运行时借用检查来确保围绕多个引用的通常规则。
std::sync::atomic
模块包含一些类型,这些类型包装一个仅通过原子操作访问的值,允许该值在线程之间共享和修改。