Rc
: for mutiple ownership, just like what python have done
When multiple ownership is needed, Rc
(Reference Counting) can be used:
Rc
keeps track of the number of the references which means the number of owners of the value wrapped inside anRc
.- Reference count of an
Rc
increases by 1 whenever anRc
is cloned - and decreases by 1 whenever one cloned
Rc
is dropped out of the scope. - When an
Rc
’s reference count becomes zero (which means there are no remaining owners), both theRc
and the value are all dropped. - Cloning an
Rc
never performs a deep copy. - Cloning creates just another pointer to the wrapped value, and increments the count.
Rc Example: Just like what Python have done
use std::rc::Rc; fn main() { let rc_examples = "Rc examples".to_string(); { println!("--- rc_a is created ---"); let rc_a: Rc<String> = Rc::new(rc_examples); println!("Reference Count of rc_a: {}", Rc::strong_count(&rc_a)); { println!("--- rc_a is cloned to rc_b ---"); let rc_b: Rc<String> = Rc::clone(&rc_a); println!("Reference Count of rc_b: {}", Rc::strong_count(&rc_b)); println!("Reference Count of rc_a: {}", Rc::strong_count(&rc_a)); // Two `Rc`s are equal if their inner values are equal println!("rc_a and rc_b are equal: {}", rc_a.eq(&rc_b)); // We can use methods of a value directly println!("Length of the value inside rc_a: {}", rc_a.len()); println!("Value of rc_b: {}", rc_b); println!("--- rc_b is dropped out of scope ---"); } println!("Reference Count of rc_a: {}", Rc::strong_count(&rc_a)); println!("--- rc_a is dropped out of scope ---"); } // Error! `rc_examples` already moved into `rc_a` // And when `rc_a` is dropped, `rc_examples` is dropped together // println!("rc_examples: {}", rc_examples); // TODO ^ Try uncommenting this line }
See also:
std::rc and std::sync::arc.