Rc<T>

  • 希望在堆上分配一个对象供程序的多个部分使用且无法确定哪个部分最后一个结束时,就可以使用 Rc 成为数据值的所有者。使用 Rc::clone(&ptr) 进行指针复制。
1
2
3
4
5
6
7
8
9
use std::rc::Rc;

fn main() {
let a = Rc::new(String::from("hello, world"));
let b = Rc::clone(&a);

assert_eq!(2, Rc::strong_count(&a));
assert_eq!(Rc::strong_count(&a), Rc::strong_count(&b))
}

这里的 Rc::clone()仅仅复制了智能指针并增加了引用计数,并没有克隆底层数据,因此 ab 是共享了底层的字符串 s.

Rc<T> 与 mutable reference

事实上,Rc<T> 是指向底层数据的不可变的引用,因此你无法通过它来修改数据,这也符合 Rust 的借用规则:要么存在多个不可变借用,要么只能存在一个可变借用。

那么如何需要修改数据该怎么办呢?这就需要 RefCell<T> 或者互斥锁 Mutex<T> 了。而在多线程里需要共享对象的话,需要 Arc<T>