Класс Cell
Класс Cell из модуля std::cell позволяет
изменять значение, хранящееся внутри структуры, даже если
сама структура является неизменяемой. Это достигается за счёт
внутренней изменяемости (interior mutability). Класс Cell
работает только с типами, реализующими трейт Copy,
либо с типами, которые можно заменить целиком. Основные методы:
new для создания, get для чтения значения
и set для установки нового значения.
Синтаксис
use std::cell::Cell;
let cell = Cell::new(value);
let value = cell.get();
cell.set(new_value);
Пример
Давайте создадим Cell с числом, прочитаем его
и изменим:
use std::cell::Cell;
fn main()
{
let cell = Cell::new(5);
println!("{}", cell.get());
cell.set(10);
println!("{}", cell.get());
}
Результат выполнения кода:
5
10
Пример
Давайте покажем, что Cell позволяет изменять
значение через неизменяемую ссылку:
use std::cell::Cell;
fn increment(cell: &Cell<i32>)
{
let current = cell.get();
cell.set(current + 1);
}
fn main()
{
let cell = Cell::new(1);
increment(&cell);
increment(&cell);
println!("{}", cell.get());
}
Результат выполнения кода:
3
Пример
Давайте сохраним в Cell строковый срез и заменим
его на другой:
use std::cell::Cell;
fn main()
{
let cell = Cell::new("abcde");
println!("{}", cell.get());
cell.set("12345");
println!("{}", cell.get());
}
Результат выполнения кода:
"abcde"
"12345"
Смотрите также
-
класс
RefCell,
который также обеспечивает внутреннюю изменяемость, но с проверкой заимствования во время выполнения -
метод
get,
который возвращает копию значения из ячейки -
метод
set,
который устанавливает новое значение в ячейку -
концепция
interior-mutability,
которая описывает внутреннюю изменяемость в Rust