РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
495 of 1245 menu

Метод 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,
    которые определяют допустимые комбинации заимствований
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить