📜  Rust Rc(T)

📅  最后修改于: 2021-01-08 14:00:15             🧑  作者: Mango

钢筋混凝土

  • Rc 代表参考计数智能指针。
  • Rc 智能指针会跟踪对某个值的引用数,以确定该值是否仍在使用中,并且如果某个值的引用为零,则可以清除该值。
  • Rc 智能指针是单线程引用计数指针。

使用RC共享数据

让我们创建两个共享第三个列表所有权的列表。

在上图中,b和c是与第三个列表a共享所有权的两个列表。

让我们使用Box 类型实现上述方案。

 enum List 
{
  Cons(i32, Box),
  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)); 
}

输出:

在上面的示例中,cons变量由类型为i32的数据和指向列表的Box 组成。我们创建列表“ b”,并将“ a”的所有权移至“ b”列表。然后,我们尝试将“ a”列表移动到“ c”列表,但是由于“ a”列表已经移动到“ b”列表,因此无法移动列表。

如何克服这个问题

我们可以通过更改cons变体的定义来克服此问题。现在,cons变体由它们保存的数据和指向List的Rc 组成。

让我们看一个简单的例子:

 enum List 
{
  Cons(i32, Rc),
  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 带入范围。代替获取a的所有权,我们将克隆a持有的Rc 列表,因此像现在一样将引用的数量从一增加到两个,a和b共享该Rc <列表>。创建c List时,我们将再次克隆Rc ,因此将引用从两个增加到三个。

克隆RC增加参考计数

现在,我们将了解列表超出范围时Rc 如何增加或减少引用计数。

让我们看一个简单的例子:

 enum List 
{
  Cons(i32, Rc),
  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 中a的初始引用计数为1,当我们调用clone时,引用计数增加1。如果变量超出范围,则引用计数减少1。因此,我们可以说当Rc /值超出范围时, Drop trait会自动减少参考计数