【Rust 基础篇】Rust 的 `Rc<RefCell<T>>` - 共享可变性的智能指针
发布人:shili8
发布时间:2025-01-25 04:32
阅读次数:0
**Rust 基础篇**
在 Rust 中,共享可变性是指多个线程可以同时访问同一个数据结构,而不需要额外的锁定或同步机制。`Rc` 和 `RefCell` 是两种常见的实现共享可变性的智能指针。
**1. Rc**
`Rc`(Reference Counting)是 Rust 中一种用于实现共享可变性的智能指针。它通过维护一个引用计数来跟踪数据结构被引用的次数。当引用计数为0 时,数据结构将被自动释放。
### 使用示例
rustuse std::rc::Rc; fn main() { let rc = Rc::new(5); println!("Value: {}", *rc); // Value:5 let rc_clone = rc.clone(); println!("Value: {}", *rc_clone); // Value:5 drop(rc); // 引用计数减为1 println!("Value: {}", *rc_clone); // Value:5}
在这个示例中,我们首先创建一个 `Rc` 智能指针,包含值5。然后我们克隆该智能指针,得到另一个引用相同数据结构的智能指针。最后,我们释放原始智能指针(使其引用计数减为1),但仍然可以访问克隆后的智能指针。
### Rc 的特性* `Rc` 智能指针是线程安全的。
* `Rc` 智能指针支持克隆功能,允许创建多个对同一数据结构的引用。
* 当所有引用都被释放时,数据结构将自动释放。
**2. RefCell**
`RefCell` 是 Rust 中一种用于实现共享可变性的智能指针。它通过维护一个内部锁来保护数据结构不被多个线程同时访问。
### 使用示例
rustuse std::cell::RefCell; fn main() { let ref_cell = RefCell::new(5); println!("Value: {}", *ref_cell.borrow()); // Value:5 let mut ref_cell_mut = ref_cell.borrow_mut(); *ref_cell_mut +=1; println!("Value: {}", *ref_cell.borrow()); // Value:6}
在这个示例中,我们首先创建一个 `RefCell` 智能指针,包含值5。然后我们使用 `borrow()` 方法获取对该数据结构的可变引用,并将其值加1。
### RefCell 的特性* `RefCell` 智能指针是线程不安全的。
* `RefCell` 智能指针支持可变访问功能,允许修改数据结构的值。
* 当所有引用都被释放时,数据结构将自动释放。
**总结**
在 Rust 中,共享可变性是通过使用智能指针来实现的。`Rc` 和 `RefCell` 是两种常见的实现共享可变性的智能指针。`Rc` 智能指针是线程安全的,并支持克隆功能,而 `RefCell` 智能指针是线程不安全的,但支持可变访问功能。