Метод borrow_mut
Метод borrow_mut класса RefCell возвращает
изменяемую ссылку на значение, хранящееся внутри ячейки.
Метод не принимает параметров и возвращает специальный
умный указатель RefMut, через который можно
изменять данные. При попытке вызвать borrow_mut,
когда уже есть активные заимствования (изменяемые или
неизменяемые), программа паникует во время выполнения.
Проверка правил заимствования происходит не на этапе
компиляции, а во время выполнения. Это позволяет
изменять данные через неизменяемую ссылку на RefCell.
Синтаксис
ref_cell.borrow_mut()
Пример
Давайте создадим RefCell с числом и изменим его
через метод borrow_mut:
use std::cell::RefCell;
fn main()
{
let cell = RefCell::new(10);
*cell.borrow_mut() = 20;
println!("{}", cell.borrow());
}
Результат выполнения кода:
20
Пример
Давайте изменим вектор внутри RefCell, добавив
в него новый элемент:
use std::cell::RefCell;
fn main()
{
let cell = RefCell::new(vec![1, 2, 3]);
cell.borrow_mut().push(4);
println!("{:?}", cell.borrow());
}
Результат выполнения кода:
[1, 2, 3, 4]
Пример
Давайте попробуем вызвать borrow_mut дважды
одновременно. Это приведёт к панике во время выполнения:
use std::cell::RefCell;
fn main()
{
let cell = RefCell::new(5);
let a = cell.borrow_mut();
let b = cell.borrow_mut();
println!("{} {}", a, b);
}
Результат выполнения кода:
thread 'main' panicked at 'already borrowed: BorrowMutError'
Пример
Давайте изменим строку внутри RefCell через
метод borrow_mut:
use std::cell::RefCell;
fn main()
{
let cell = RefCell::new(String::from("abcde"));
cell.borrow_mut().push_str("12345");
println!("{}", cell.borrow());
}
Результат выполнения кода:
"abcde12345"
Смотрите также
-
метод
borrow,
который возвращает неизменяемую ссылку на данные внутри RefCell -
класс
RefCell,
который обеспечивает внутреннюю изменяемость с проверкой заимствований во время выполнения -
концепция
interior-mutability,
которая позволяет изменять данные через неизменяемую ссылку -
правила
borrow-rules,
которые определяют допустимые комбинации заимствований