07 Cell<T>和RefCell<T>

  • 拾一维
  • 更新于 2023-03-10 22:53
  • 阅读 973

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

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

  • 原创
  • 学分: 2
  • 分类: Rust
  • 标签: Rust 
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
拾一维
拾一维
For science, art and meaning