5 分钟速读之 Rust 权威指南(二十七)Rc<T>
使用 Rc<T>共享数据
前面我们有使用 Box<T>实现链表,本节我们以一道题开始,先试着实现图中的列表:
[配图]
图中列表 a 包含 5 ,后面跟着的是 10,列表 b 从 3 开始,列表 c 从 4 开始。b 和 c 会接上包含 5 和 10 的列表 a。换句话说,这两个列表会尝试共享 a 列表所包含的 5 和 10。
使用 Box<T>实现
我们先尝试使用已经学过的 Box<T>类型来实现:
复制代码
利用引用来解决 a 的所有权转移的问题
我们可以将 Box 中的列表类型改为引用类型,这样 b 和 c 列表就可以同时引用 a 列表了:
复制代码
引用方式一:
复制代码
引用方式二:
复制代码
虽然可以实现,但是嵌套关系不是很直观。
使用 Rc<T>来解决
Rc<T>支持多重所有权,它名称中的 Rc 是 Referencecounting(引用计数)的缩写。对于了解垃圾回收概念的同学理解起来会更顺畅一些,Rc<T>类型会在内部维护一个引用次数计数器,用于确认这个值是否仍在使用。如果对一个值的引用次数为零,那么就意味着这个值可以被安全地清理掉,而不会触发引用失效的问题:
复制代码
观察引用计数
通过 Rc<T>提供的方法可以获取到当前的引用数量:
复制代码
Rc<T>通过不可变引用使得程序的不同部分之间可以共享只读数据。如果 Rc<T>也允许持有多个可变引用的话,那么它就会违反借用规则:多个指向同一区域的可变借用会导致数据竞争及数据不一致。
版权声明: 本文为 InfoQ 作者【码生笔谈】的原创文章。
原文链接:【http://xie.infoq.cn/article/809548f99c485400e955c9deb】。文章转载请联系作者。
评论