Refcell
Warning
Внутренняя изменяемость - это паттерн проектирования Rust, который позволяет вам изменять данные даже при наличии неизменяемых ссылок на эти данные;
Для изменения данных паттерн использует
unsafeкод внутри структуры данных, чтобы обойти обычные правила Rust
Применение правил заимствования во время выполнения с помощью RefCell<T>
В отличие от
Rc<T>типRefCell<T>предоставляет единоличное владение данными, которые он содержит.
Правила заимствования
- В любой момент времени вы можете иметь либо одну изменяемую ссылку либо сколько угодно неизменяемых ссылок (но не оба типа ссылок одновременно).
- Ссылки всегда должны быть действительными.
типа
Box<T>— применяются на этапе компиляции
RefCell<T>применяется во время работы программы
Note
Тип
RefCell<T>полезен, когда вы уверены, что ваш код соответствует правилам заимствования, но компилятор не может понять и гарантировать этого.
Подобно типу
Rc<T>, типRefCell<T>предназначен только для использования в однопоточных сценариях
Список причин выбора типов Box<T>, Rc<T> или RefCell<T>:
- Тип
Rc<T>разрешает множественное владение одними и теми же данными; типыBox<T>иRefCell<T>разрешают иметь единственных владельцев. - Тип
Box<T>разрешает неизменяемые или изменяемые владения, проверенные при компиляции; - тип
Rc<T>разрешает только неизменяемые владения, проверенные при компиляции; - тип
RefCell<T>разрешает неизменяемые или изменяемые владения, проверенные во время выполнения. - Поскольку
RefCell<T>разрешает изменяемые заимствования, проверенные во время выполнения, можно изменять значение внутриRefCell<T>даже еслиRefCell<T>является неизменным.
мок объекты
Инсценировочные (mock) объекты — это особый тип тестовых дублёров, которые сохраняют данные происходящих во время теста действий тем самым позволяя вам убедиться впоследствии, что все действия были выполнены правильно.
У типа RefCell<T>, мы используем методы borrow и borrow_mut, которые являются частью безопасного API, который принадлежит RefCell<T> вместо & и &mut