📅  最后修改于: 2021-01-08 14:00:15             🧑  作者: Mango
让我们创建两个共享第三个列表所有权的列表。
在上图中,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
我们可以通过更改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 ,因此将引用从两个增加到三个。
现在,我们将了解列表超出范围时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