Внутренняя изменяемость
Внутренняя изменяемость - это механизм в Rust, который позволяет
изменять значение, даже если у вас есть только неизменяемая ссылка
на него. Обычно Rust запрещает изменять данные через
&T, но типы вроде Cell, RefCell и
Mutex обходят это правило на этапе компиляции, перенося
проверку заимствования на время выполнения программы или используя
специальные безопасные операции. Параметром таких методов обычно
выступает новое значение или замыкание, которое нужно применить
к внутренним данным.
Синтаксис
use std::cell::Cell;
use std::cell::RefCell;
let cell = Cell::new(value);
cell.set(new_value);
let refcell = RefCell::new(value);
*refcell.borrow_mut() = new_value;
Пример
Давайте изменим значение через неизменяемую ссылку с помощью
Cell:
use std::cell::Cell;
fn main()
{
let cell = Cell::new(10);
let ref_to_cell = &cell;
ref_to_cell.set(20);
println!("{}", cell.get());
}
Результат выполнения кода:
20
Пример
Давайте изменим вектор через неизменяемую ссылку с помощью
RefCell:
use std::cell::RefCell;
fn main()
{
let refcell = RefCell::new(vec![1, 2, 3, 4, 5]);
let ref_to_refcell = &refcell;
ref_to_refcell.borrow_mut().push(6);
println!("{:?}", refcell.borrow());
}
Результат выполнения кода:
[1, 2, 3, 4, 5, 6]
Смотрите также
-
тип
Cell,
который реализует внутреннюю изменяемость для Copy-типов -
тип
RefCell,
который проверяет правила заимствования во время выполнения -
правила
заимствования,
которые лежат в основе безопасной работы с ссылками -
тип
Cow,
который использует внутреннюю изменяемость для клонирования при записи