Rc
Когда необходимо множественное владение, может использоваться
Rc
(счётчик ссылок). Rc
отслеживает
количество ссылок, означающих количество владельцев значения,
сохранённого в Rc
.
Количество ссылок на Rc
увеличивается на 1 каждый
раз, когда Rc
клонируется, и уменьшается на 1, когда
один из клонов выходит из области видимости и удаляется. Когда
количество ссылок на Rc
становится равным нулю,
т.е. владельцев больше нет, и Rc
, и значение
удаляются.
При клонировании Rc
никогда не делается глубокая
копия. Клонирование лишь создаёт другой указатель на обёрнутое
значение и увеличивает счётчик.
use std::rc::Rc; fn main() { let rc_examples = "Пример с Rc".to_string(); { println!("--- Создана rc_a ---"); let rc_a: Rc<String> = Rc::new(rc_examples); println!("Количество ссылок на rc_a: {}", Rc::strong_count(&rc_a)); { println!("--- rc_a клонировано в rc_b ---"); let rc_b: Rc<String> = Rc::clone(&rc_a); println!("Количество ссылок на rc_b: {}", Rc::strong_count(&rc_b)); println!("Количество ссылок на rc_a: {}", Rc::strong_count(&rc_a)); // Два `Rc` равны, если равны их внутренние значения println!("rc_a и rc_b равны: {}", rc_a.eq(&rc_b)); // Мы можем напрямую использовать методы внутреннего значения println!("Размер значения внутри rc_a: {}", rc_a.len()); println!("Значение rc_b: {}", rc_b); println!("--- rc_b удаляется ---"); } println!("Количество ссылок на rc_a: {}", Rc::strong_count(&rc_a)); println!("--- rc_a удаляется ---"); } // Ошибка! `rc_examples` уже перемещена в `rc_a` // И когда `rc_a` удалилась, `rc_examples` удалилась вместе с ней // println!("rc_examples: {}", rc_examples); // TODO ^ Попробуйте удалить комментарий эту строку }