Метод borrow
Метод borrow класса RefCell возвращает
умный указатель Ref<T>, который предоставляет
неизменяемый доступ к данным, хранящимся внутри
RefCell. В отличие от обычных ссылок, проверка
правил заимствования происходит не на этапе компиляции,
а во время выполнения программы. Метод не принимает
параметров. Если на момент вызова уже существует
изменяемое заимствование borrow_mut, программа
завершится паникой.
Синтаксис
refcell.borrow()
Пример
Давайте создадим RefCell с числом 5
и получим неизменяемую ссылку через метод borrow:
use std::cell::RefCell;
fn main()
{
let cell = RefCell::new(5);
let value = cell.borrow();
println!("{}", *value);
}
Результат выполнения кода:
5
Пример
Метод borrow позволяет получить несколько
неизменяемых заимствований одновременно:
use std::cell::RefCell;
fn main()
{
let cell = RefCell::new(10);
let value1 = cell.borrow();
let value2 = cell.borrow();
println!("{} {}", *value1, *value2);
}
Результат выполнения кода:
10 10
Пример
Давайте посмотрим, что произойдёт, если вызвать
borrow при активном изменяемом заимствовании:
use std::cell::RefCell;
fn main()
{
let cell = RefCell::new(10);
let mut mut_ref = cell.borrow_mut();
*mut_ref = 20;
let value = cell.borrow();
println!("{}", *value);
}
Результат выполнения кода:
thread 'main' panicked at 'already mutably borrowed: BorrowError'
Смотрите также
-
класс
RefCell,
который обеспечивает изменяемость внутри неизменяемого значения -
метод
borrow_mut,
который возвращает изменяемое заимствование данных -
метод
getкласса Cell,
который копирует значение из ячейки -
тема
interior mutability,
которая описывает изменяемость через неизменяемую ссылку