📔 简约整理流笔记,现在还没有用用到的地方所以了解得不深……
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>
。
Cell
和 RefCell
可以在不可变结构中提供可变变量。(仅限结构的内部方法)。
Cell
通过操作值本身实现可变性, RefCell
通过操作引用实现。
新建一个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>>
),这样就有了多个所有者的同时还能改变内容。