本文概述
- 使用Rc < T> 共享数据
- 如何克服这个问题
- 克隆Rc < T> 会增加引用计数
- Rc < T> 代表引用计数智能指针。
- Rc < T> 智能指针会跟踪对某个值的引用数, 以确定该值是否仍在使用中, 并且如果某个值的引用为零, 则可以清除该值。
- Rc < T> 智能指针是单线程引用计数指针。
文章图片
在上图中, b和c是与第三个列表a共享所有权的两个列表。
让我们使用Box < T> 类型实现上述方案。
enum List
{
Cons(i32, Box<
List>
), Nil, }
use List::{Cons, Nil};
fn main()
{
let a = Cons(10, Box::new(Cons(15, Box::new(Nil))));
let b = Cons(2, Box::new(a));
let c = Cons(1, Box::new(a));
}
【Rust RC T用法解析】输出
文章图片
在上面的示例中, cons变量由i32类型的数据和指向列表的Box < T> 组成。我们创建列表” b” , 并将” a” 的所有权移至” b” 列表。然后, 我们尝试将” a” 列表移动到” c” 列表, 但是由于” a” 列表已经移动到” b” 列表, 因此无法移动列表。
如何克服这个问题 我们可以通过更改cons变体的定义来克服此问题。现在, cons变量由它们保存的数据和Rc < T> 指向列表组成。
让我们看一个简单的例子:
enum List
{
Cons(i32, Rc<
List>
), Nil, }
use List::{Cons, Nil};
use std::rc::Rc;
fn main()
{
let a = Rc::new(Cons(10, Rc::new(Cons(15, Rc::new(Nil)))));
let b = Cons(2, Rc::clone(&
a));
let c = Cons(1, Rc::clone(&
a));
}
在上面的示例中, 我们需要添加use语句以将Rc < T> 纳入范围。代替获取a的所有权, 我们将克隆a持有的Rc < T> 列表, 因此, 现在将引用的数量从一增加到两个, a和b正在共享该Rc < 列表> 。创建c List时, 我们将再次克隆Rc < List> , 因此将引用从两个增加到三个。
克隆Rc < T> 会增加引用计数 现在, 我们将了解列表超出范围时Rc < T> 如何增加或减少引用计数。
让我们看一个简单的例子:
enum List
{
Cons(i32, Rc<
List>
), Nil, }
use List::{Cons, Nil};
use std::rc::Rc;
fn main()
{
let a = Rc::new(Cons(10, Rc::new(Cons(15, Rc::new(Nil)))));
println!("Reference count after creating a List : {}", Rc::strong_count(&
a));
let b = Cons(2, Rc::clone(&
a));
println!("Reference count after creating b List : {}", Rc::strong_count(&
a));
{
let c = Cons(1, Rc::clone(&
a));
println!("Reference count after creating c List : {}", Rc::strong_count(&
a));
}
println!("Reference count when c goes out of the scope : {}", Rc::strong_count(&
a));
}
输出
Reference count after creating a List : 1
Reference count after creating b List : 2
Reference count after creating c List : 3
Reference count when c goes out of the scope : 2
在上面的示例中, 我们通过调用Rc :: strong_count函数来打印引用计数。 Rc < List> 中a的初始引用计数为1, 当我们调用clone时, 引用计数增加1。如果变量超出范围, 则引用计数减少1。因此, 我们可以说当Rc < T> /值超出范围时, Drop trait会自动减少引用计数。
推荐阅读
- Rust生命周期详细图解
- Rust Box T用法
- Rust删除特质trait实例分析
- Rust Deref T解析和用法
- Rust可恢复错误处理实例分析
- Rust带有panic!不可恢复的错误
- Rust什么是向量(向量的用法)
- Rust字符串的介绍和用法
- Rust所有权和内存分析图解