老實說我還真的想不到要寫啥了,有關基礎語法,真的很難想欸QQ
拜託來個人給我點想法吧 QQQQQQQQ
然後我在想是不是字數不超過 2000 那天就在水 希望大家看到都能夠理解我說的內容
喔對 大家都不愛複習 QQ Leetcode 那篇有教一些小地方 我前面忘記講的可以去看看。
今天就來講一下智慧指標吧,後面 unsafe 應該會講到原生指標,如果我記得的話。
然後我先講,我沒有學過 C++ 的智慧指標,所以不會提及有關 C++ 純粹個人理解。
那就開始ㄅ owob
先對比一下 原生指標 跟 智慧指標 吧
在 Rust 中最簡單的智慧指標是 Box 所以我之前好像講某個東西的時候重複命名了 QQ 沒注意到sor
建立方式如下
let owo = Box::new(87);
那 Box 簡單講主要是將數值分配到 heap 上而不是 stack。
Box 的功能其實偏少,也代表了他佔用的效能其實不多。跟一般的指標差別只在分配位置。
使用的場合主要分成三類:
老實說,這邊到底誰看得懂 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 能力不夠
然後真的開始覺得累 嗚嗚
引用我朋友的一句話
本次參考資源: