Catalyst

Rust 笔记(四)智能指针等

📔 简约整理流笔记,现在还没有用用到的地方所以了解得不深……

Box

之前的笔记里提到了

Box<dyn std::error::Error>可以接受任何类型的error。在函数中,可以把多种类型的错误展成此一种错误。

Box 类型可以将其中的值分配在堆上,并返回指向它的指针。

它最常使用的场景是:

  • 包裹未知长度的类型以用在需要限定长度的上下文中。(Box的大小:指针大小。因此可以用在递归定义中。)
  • 需要转换大量数据的所有权并不希望数据被复制。
  • 你只希望确定变量是有某种特征的变量而并不在意它的具体类型。

使用Box

let a = Box::new(123);

Rc

Rc(Reference Counting) 记录变量的多个所有者。当Rc的计数为 0 时,证明无所有者,所有值都被删除。

//建立一个 Rc 计数
let ori = 3;
let a = Rc::new(ori);

//clone 增加 Rc 计数,浅拷贝
let b = Rc::clone(&a);

Arc

Arc(Atomic Reference Counted),在线程间共享所有权。

use std::sync::Arc;

let value = Arc::new("value");
//在线程中
let value2 = Arc::clone(&value);

如果只改变单个线程中共享的量,则用不上 Rc

Cell

Cell分为 Cell<T>RefCell<T>

CellRefCell 可以在不可变结构中提供可变变量。(仅限结构的内部方法)。

Cell 通过操作值本身实现可变性, RefCell 通过操作引用实现。

Cell 文档

新建一个Cell:

use std::cell::Cell
let a = Cell::new(123);

使用Cell里的数据

//返回里面的值的拷贝
a.get();

//设置里面的数据
a.set(1);

//替换数据并返回原数据
a.replace(10);

新建一个RefCell

use std::cell::RefCell
let b = RefCell::new(123);

使用RefCell里的数据

b.borrow_mut();
b.borrow();

通常结合 Rc 一起使用 ( Rc<RefCell<T>> ),这样就有了多个所有者的同时还能改变内容。