study_example/smart_pointer/
rc_t_count_pointer.rs

1// 添加一个 use 语句将 Rc<T> 纳入范围,因为它不在序言中
2use super::box_pointer::List;
3use std::rc::Rc;
4
5fn multi_pointer_one_box_data() {
6    let a = List::Cons(5, Box::new(List::Cons(10, Box::new(List::Nil))));
7    let b = List::Cons(15, Box::new(a));
8    // error[E0382]: use of moved value: `a`
9    // let c = List::Cons(18, Box::new(a));
10}
11
12#[derive(Debug)]
13pub enum RcList {
14    Cons(i32, Rc<RcList>),
15    Nil,
16}
17
18/// 运行结果如下
19/// ```txt
20/// crate a: Rc::strong_count(&a) = 1
21/// crate b and after clone a: Rc::strong_count(&a) = 2
22/// crate c and after clone a: Rc::strong_count(&a) = 3
23/// multi_pointer_one_rc_data b: Cons(15, Cons(5, Cons(10, Nil)))
24/// multi_pointer_one_rc_data c: Cons(18, Cons(5, Cons(10, Nil)))
25/// crate d and after clone d: Rc::strong_count(&a) = 4
26/// leving d scope: Rc::strong_count(&a) = 3
27/// ```
28fn multi_pointer_one_rc_counter() {
29    let a = Rc::new(RcList::Cons(
30        5,
31        Rc::new(RcList::Cons(10, Rc::new(RcList::Nil))),
32    ));
33    println!("crate a: Rc::strong_count(&a) = {}", Rc::strong_count(&a));
34    // Rc::clone 的实现不会像大多数类型的 clone 实现那样对所有数据进行深层复制。对 Rc::clone 的调用只会增加引用计数,这不会花费太多时间。数据的深层复制可能会花费大量时间
35    let b = RcList::Cons(15, Rc::clone(&a));
36    println!(
37        "crate b and after clone a: Rc::strong_count(&a) = {}",
38        Rc::strong_count(&a)
39    );
40    let c = RcList::Cons(18, Rc::clone(&a));
41    println!(
42        "crate c and after clone a: Rc::strong_count(&a) = {}",
43        Rc::strong_count(&a)
44    );
45    println!("multi_pointer_one_rc_data b: {:?}", b);
46    println!("multi_pointer_one_rc_data c: {:?}", c);
47    {
48        let d = RcList::Cons(21, Rc::clone(&a));
49        println!(
50            "crate d and after clone d: Rc::strong_count(&a) = {}",
51            Rc::strong_count(&a)
52        );
53    }
54    println!(
55        "leving d scope: Rc::strong_count(&a) = {}",
56        Rc::strong_count(&a)
57    );
58}
59
60pub fn rc_t_count_pointer_study() {
61    multi_pointer_one_box_data();
62    multi_pointer_one_rc_counter();
63}