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