rust语言学习笔记(指针二)Rc<T>(单线程引用计数)

2.1 共享只读数据(单线程)

rust 复制代码
use std::rc::Rc;

fn main() {
    let v = Rc::new(10);       // 创建一个 Rc 指针,初始引用计数为 1
    let v2 = Rc::clone(&v);    // 创建一个 Rc 指针,引用计数增加 1,(推荐写法)
    let v3 = v.clone();        // 创建一个 Rc 指针,引用计数增加 1

    // *v 是解引用操作,类型是 i32
    let value: i32 = *v;
    println!("*v 的类型是 i32,值: {}", value);

    // v 是 Rc<i32> 类型,是智能指针
    // 但 Debug trait 会自动解引用打印内部值
    println!("v 的类型是 Rc<i32>,Debug 打印: {:?}", v);

    println!("v2 的类型是 Rc<i32>,Debug 打印: {:?}", v2);
    println!("v3 的类型是 Rc<i32>,Debug 打印: {:?}", v3);
    println!("引用计数: {}", Rc::strong_count(&v));
}

2.2 构建递归数据结构(如链表、树)

rust 复制代码
use std::rc::Rc;

#[derive(Debug)]
enum List {
    Cons(i32, Rc<List>),
    Nil,
}

use crate::List::{Cons, Nil};

fn main() {
    let list1 = Rc::new(Cons(1, Rc::new(Nil)));
    
    let list2 = Cons(2, Rc::clone(&list1));        // 共享 list1 的所有权
    let list3 = Cons(3, Rc::clone(&list1));        // 共享 list1 的所有权
    
    println!("{:?}", list2);
    println!("{:?}", list3);
}