Rc<T>, 引用计数器,用来记录一个值是否被使用,如果计数为零可清除。适用于堆中数据需要被程序多部分使用,但编译时不能确定谁最后完成。
大部分情况下所有权是非常明确的:可以准确的知道哪个变量拥有某个值。然而,有些情况单个值可能会有多个所有者。例如,在图数据结构中,多个边可能指向相同的结点,而这个结点从概念上讲为所有指向它的边所拥有。结点直到没有任何边指向它之前都不应该被清理。
为了启用多所有权,Rust 有一个叫做 Rc<T> 的类型。其名称为 引用计数(reference counting)的缩写。引用计数意味着记录一个值引用的数量来知晓这个值是否仍在被使用。如果某个值有零个引用,就代表没有任何有效引用并可以被清理。
例子:
// enum List { // Cons(i32, Box<List>), // Nil, // } // use crate::List::{Cons, Nil}; enum List { Cons(i32, Rc<List>), Nil, } use crate::List::{Cons, Nil}; use std::rc::Rc; fn main() { // let a = Cons(5, Box::new(Cons(10, Box::new(Nil)))); let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil))))); // let b = Cons(3, Box::new(a)); // let b = Cons(3, Rc::clone(&a)); let b = Cons(3, a.clone()); // Rc<T>通过clone来获得新的Rc<T>指针,增加计数 // let c = Cons(4, Box::new(a)); let c = Cons(4, Rc::clone(&a)); }
本节全部源代码:
https://github.com/anonymousGiga/learn_rust/blob/master/learn_rc1/src/main.rs