智能指针
发布时间: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)]),
});
}
学习目标
- 理解智能指针的概念和用途
- 掌握 Box
的基本使用 - 学习 Rc
和共享所有权 - 理解 RefCell
和内部可变性 - 使用 RefCell
实现一个可修改的mock对象
练习
通过以下练习加深对智能指针的理解:
- 实现一个使用 Box
的二叉树 - 创建一个使用 Rc
共享数据的程序 - 使用 RefCell
实现一个可修改的mock对象