智能指针

发布时间:2025年1月6日

什么是智能指针?

智能指针是一种数据结构,行为类似指针,但具有额外的元数据和功能。

Box

Box 是最简单的智能指针,它允许你将值存储在堆上:

递归类型示例
enum List {
    Cons(i32, Box),
    Nil,
}

Rc

引用计数智能指针允许数据有多个所有者:

引用计数示例
use std::rc::Rc;

enum List {
    Cons(i32, Rc),
    Nil,
}

fn main() {
    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    let b = Cons(3, Rc::clone(&a));
    let c = Cons(4, Rc::clone(&a));
}

RefCell

内部可变性模式允许你在有不可变引用时修改数据:

内部可变性示例
use std::cell::RefCell;

fn main() {
    let data = RefCell::new(5);
    
    *data.borrow_mut() += 1;
    
    println!("data = {:?}", data.borrow());
}

组合智能指针

可以组合使用不同的智能指针来获得更强大的功能:

组合使用示例
use std::rc::Rc;
use std::cell::RefCell;

#[derive(Debug)]
struct Node {
    value: i32,
    children: RefCell>>,
}

fn main() {
    let leaf = Rc::new(Node {
        value: 3,
        children: RefCell::new(vec![]),
    });
    
    let branch = Rc::new(Node {
        value: 5,
        children: RefCell::new(vec![Rc::clone(&leaf)]),
    });
}

学习目标

  1. 理解智能指针的概念和用途
  2. 掌握 Box 的基本使用
  3. 学习 Rc 和共享所有权
  4. 理解 RefCell 和内部可变性
  5. 使用 RefCell 实现一个可修改的mock对象

练习

通过以下练习加深对智能指针的理解:

  1. 实现一个使用 Box 的二叉树
  2. 创建一个使用 Rc 共享数据的程序
  3. 使用 RefCell 实现一个可修改的mock对象
返回主页