iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
Software Development

Rust的多方面運用系列 第 11

[Day11] 智慧指標

  • 分享至 

  • xImage
  •  

老實說我還真的想不到要寫啥了,有關基礎語法,真的很難想欸QQ
拜託來個人給我點想法吧 QQQQQQQQ
然後我在想是不是字數不超過 2000 那天就在水 希望大家看到都能夠理解我說的內容
喔對 大家都不愛複習 QQ Leetcode 那篇有教一些小地方 我前面忘記講的可以去看看。


今天就來講一下智慧指標吧,後面 unsafe 應該會講到原生指標,如果我記得的話。
然後我先講,我沒有學過 C++ 的智慧指標,所以不會提及有關 C++ 純粹個人理解。
那就開始ㄅ owob
先對比一下 原生指標 跟 智慧指標 吧

  • 初始指標會將變數指向記憶體位址
  • 智慧指標除了能將變數指向記憶體位置外還能提供其他資訊,像是之前講過的很多結構體都是智慧型指標owo

在 Rust 中最簡單的智慧指標是 Box 所以我之前好像講某個東西的時候重複命名了 QQ 沒注意到sor
建立方式如下

let owo = Box::new(87);

那 Box 簡單講主要是將數值分配到 heap 上而不是 stack。
Box 的功能其實偏少,也代表了他佔用的效能其實不多。跟一般的指標差別只在分配位置。
使用的場合主要分成三類:

  • 型別無法在編譯期間知道大小但是又想在知道使用在需要知道大小的地方
  • 需要轉移龐大資料且須確保不會被 copy 時
  • 當需要一個值但是需要的是實作特徵而非是特定型別

老實說,這邊到底誰看得懂 QQ
所以下面就來舉例吧
遞迴型別
這個應該顯而易見,無法知道確切大小的型別。
就直接拿官方的"直白的"例子吧!
Cons List
這個的概念會是建立一個容器並且將元素 x 作為此容器開頭並以元素 y 作為此容器結尾
上面所說 x 跟 y 是傳入值ㄛ 他都會包含兩個元素

  • 目前項目
  • 下一個項目

那如果說到底了,就會包含一個 Nil
好了 所以我們就定義一個 enum 實現上面所說的東西吧!
如果昨天的有認真看應該知道怎麼用吧 不然就我寫太爛 嗚嗚

enum List {
    Cons(i32, List),
    Nil,
}

可以發現 List 那這樣就會遞迴下去ㄌ
引用之後編譯會發現一堆報錯

要怎麼解決呢 靠上面的 Box 阿
這樣的話他就不會認定為是一個遞迴形式了,也就是以 Box 取代了原本的形式

enum List {
    Cons(i32, Box<List>),
    Nil,
}

那這樣使用的時候就不會出錯了 owob
蛤 不知道怎麼傳入ㄇ 那我附給你好了

let Cons_List = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));

那當他的數值離開作用域之後也會自動回收,這就是智慧指標
這邊最後在講個

fn k() {
    let a = Box::new(5);
    //let b = a; 會報錯
    let b = *a; // 這樣才能傳輸所有權
}

這邊在介紹一個 Rc 的智慧指標
Rc 可以將多個所有權共用多個變數
每當多了一個計數就會加一。

use std::rc::Rc;

fn main() {
    let a = Rc::new(50);
    let b = a.clone();
    let c = a.clone();
    println!("{}", Rc::strong_count(&a));
}

這個會輸出 3
但是需要注意的是,這個只能在單一 thread 中運用,多線程可能之後會說明吧(?

let owo = Rc::downgrade(&a);
println!("{}", Rc::strong_count(&a));

那加上這兩行會輸出甚麼, Ans: 3
一樣是 3 為啥,因為他是強參考的計數而不是弱參考的計數,owo 是屬弱參考
弱參考是 Rc 的另一個版本 Weak
他所共用的指標並沒有所有權,但是還是保留著前面 Rc 的參考。


今天大概就這樣,我得說 智慧指標 這東西我真的沒用過,所以這次翻書的時間長了很多。
可能有蠻多地方講得不好的,深感抱歉。
可是這個形式真的還不錯,邊寫文章邊學習。
這邊有問題的可能我沒辦法回答 QQ 能力不夠
然後真的開始覺得累 嗚嗚
引用我朋友的一句話

本次參考資源:

  • Rust Book
  • 我 Rust 我驕傲

上一篇
[Day10] 列舉體與錯誤處理
下一篇
[Day12] Trait 與 STD 庫中的 fs
系列文
Rust的多方面運用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言