Внутренняя изменяемость
Иногда возникает необходимость изменять тип, имея несколько псевдонимов на него. В Rust это достигается с использованием паттерна, называемого внутренняя изменяемость.
Тип обладает внутренней изменяемостью, если его внутреннее состояние может быть изменено через разделяемую ссылку на него.
Это противоречит обычному требованию, что значение, на которое указывает разделяемая ссылка, не должно изменяться.
Тип std::cell::UnsafeCell<T> — это единственный разрешённый способ отключить
данное требование. Когда UnsafeCell<T> имеет неизменяемый псевдоним, всё ещё безопасно
изменять или получать изменяемую ссылку на содержащийся в нём T.
Как и для всех других типов, наличие нескольких псевдонимов &mut UnsafeCell<T>
является неопределённым поведением.
Другие типы с внутренней изменяемостью могут быть созданы путём использования UnsafeCell<T> в качестве
поля. Стандартная библиотека предоставляет множество типов, которые обеспечивают безопасные
API для внутренней изменяемости.
Например, std::cell::RefCell<T> использует проверки заимствований во время выполнения для обеспечения обычных правил работы с множественными ссылками.
Модуль std::sync::atomic содержит типы, которые оборачивают значение, доступ к которому осуществляется
только с помощью атомарных операций, что позволяет совместно использовать и изменять значение
между потоками.