Rust 程式設計影片教程(進階)——013 使用 Rc 引用計數智慧指標

linghuyichong發表於2020-02-02

頭條地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/

github地址:https://github.com/anonymousGiga/learn_rus...

1、考慮需求
Rust
b和c共享a的所有權,該如何實現.
例子1: 使用Box實現

enum List {
    Cons(i32, Box<List>),
    Nil,
}
use crate::List::{Cons, Nil};
fn main() {
    let a = Cons(5,
        Box::new(Cons(10,
            Box::new(Nil))));
    let b = Cons(3, Box::new(a));
    let c = Cons(4, Box::new(a));
}

此實現報錯。提示已經被move了。

例子2:使用Rc實現

enum List {
    Cons(i32, Rc<List>),
    Nil,
}
use crate::List::{Cons, Nil};
use std::rc::Rc;
fn main() {
    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    let b = Cons(3, Rc::clone(&a));   //此處使用a.clone()也是ok的
    let c = Cons(4, Rc::clone(&a));
}

2、克隆Rc會增加引用計數

fn main() {
    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    println!("count after creating a = {}", Rc::strong_count(&a));
    let b = Cons(3, Rc::clone(&a));
    println!("count after creating b = {}", Rc::strong_count(&a));
    {
        let c = Cons(4, Rc::clone(&a));
        println!("count after creating c = {}", Rc::strong_count(&a));
    }
    println!("count after c goes out of scope = {}", Rc::strong_count(&a));
}

透過Rc::strong_count函式能列印除引用計數。

3、透過Rc允許程式的多個部分之間只讀的共享資料,因為相同位置的多個可變引用可能會造成資料競爭和不一致。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章