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

Класс RefCell

Класс RefCell представляет собой умный указатель, который позволяет обойти правила заимствования Rust на этапе компиляции и проверять их во время выполнения. Это один из инструментов внутренней изменяемости (interior mutability), позволяющий менять данные, даже когда сам RefCell доступен только по неизменяемой ссылке. Параметром тип принимает любое значение T, которым нужно управлять.

Основное отличие от обычных ссылок заключается в том, что правила заимствования проверяются не компилятором, а во время выполнения. Если вы нарушите правила (например, попытаетесь получить изменяемую ссылку, когда уже есть неизменяемая), программа запаникует. Для безопасной проверки без паники используйте методы try_borrow и try_borrow_mut.

Синтаксис

use std::cell::RefCell; let value = RefCell::new(initial_value);

Пример

Давайте создадим RefCell с числом и изменим его через неизменяемую ссылку:

use std::cell::RefCell; fn main() { let cell = RefCell::new(10); *cell.borrow_mut() += 5; println!("{}", cell.borrow()); }

Результат выполнения кода:

15

Пример

Давайте получим две неизменяемые ссылки одновременно. Это разрешено, так как читать данные можно нескольким владельцам сразу:

use std::cell::RefCell; fn main() { let cell = RefCell::new(42); let a = cell.borrow(); let b = cell.borrow(); println!("{} {}", a, b); }

Результат выполнения кода:

42 42

Пример

Давайте попробуем получить изменяемую ссылку, когда уже существует неизменяемая. Это приведёт к панике во время выполнения:

use std::cell::RefCell; fn main() { let cell = RefCell::new(10); let a = cell.borrow(); let b = cell.borrow_mut(); println!("{} {}", a, b); }

Результат выполнения кода:

thread 'main' panicked at 'already borrowed: BorrowMutError'

Смотрите также

  • класс Cell,
    который также обеспечивает внутреннюю изменяемость
  • метод borrow,
    который возвращает неизменяемую ссылку на значение
  • метод borrow_mut,
    который возвращает изменяемую ссылку на значение
  • тема внутренняя изменяемость,
    которая объясняет концепцию изменения данных через неизменяемые ссылки
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить