Rc
大部分情况下所有权是非常明确的:可以准确的知道哪个变量拥有某个值。然而,有些情况单个值可能会有多个所有者。例如,在图数据结构中,多个边可能指向相同的结点,而这个结点从概念上讲为所有指向它的边所拥有。结点直到没有任何边指向它之前都不应该被清理。
为了启用多所有权,Rust 有一个叫做 Rc
例子:
// 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