07 Cell<T>和RefCell<T>

拾一维 发布于 2023-03-10 阅读 3939

1可变与不可变在Rust中声明一个变量时,要明确变量的可变性。默认是不可变的,如果想要修改这个变量,必须先将其声明为可变类型,否则编译无法通过。如:2共享可变容器但是我们在实际的业务中可能需要更改不可变变量。如何做到这一点?Rust提供了两类容器类型,允许在运行时更改不可变变量,它们是

1 可变与不可变

在Rust中声明一个变量时,要明确变量的可变性。默认是不可变的,如果想要修改这个变量,必须先将其声明为可变类型,否则编译无法通过。如: 7.1.png

2 共享可变容器

但是我们在实际的业务中可能需要更改不可变变量。如何做到这一点? Rust提供了两类容器类型,允许在运行时更改不可变变量,它们是Cell<T> 和 CellRef <T>。我们先来了解下它们到底是什么?

7.2.png

可以看到它们都是由UnsafeCell提供支持的泛型结构体,?Sized代表它容纳的类型大小可以是动态的。UnsafeCell是Rust中唯一可以把不可变引用转为可变指针的方式。本质是把原始指针*mut 给开发者从而获得内部可变性,而外部可变性是通过mut显式声明的

3 使用案例

3.1 Cell 的使用

7.3.1.png

3.2 RefCell 的使用

7.3.2.png 今天真是非常轻松愉快的一期内容呢。另外,RefCell和Cell容器还有一些其它的方法,感兴趣的朋友可以自行查看。可变共享容器并不难,难的是怎么在实际的业务场景中灵活运用

示例代码Github地址:

https://github.com/shiyivei/from-principle-to-practice/blob/main/src/principle-and-practice/src/type_system/contain_type.rs

另外,可以选择clone本仓库代码,使用cargo doc --open阅读,体验更佳

git clone git@github.com:shiyivei/from-principle-to-practice.git
cd from-principle-to-practice
cargo doc --open

更多内容欢迎关注公众号拾一维

该文章收录于
Rust进阶知识
35 订阅 11 篇内容

0 条评论