iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0

生命週期是什麼

生命週期指的是一個變數的出生與死亡,就字面上來看其實蠻白話的

看起來我們好像只要知道他什麼時候出生跟什麼時候死亡就好?

不過在 Rust 中其實沒這麼簡單

Rust 中的生命週期怎麼算

Rust 的生命週期跟所有權息息相關,

所謂的生命週期指的是這個變數活得久不久,夠不夠久

一個變數的開始是在我們定義他的時候,卻有很多種狀況結束

結束是什麼意思?指的是變數已經不存在於記憶體中了

為什麼要有生命週期

生命週期用於追蹤變數的「有效期限」,避免參考到已被釋放或不再有效的資料,

這點也讓程式碼在編譯期間能保證這個程式碼是安全的,減少誤觸記憶體的地雷

有些程式語言會使用手動來管理記憶體,這樣可以掌握記憶體的使用狀況,不過缺點是可能會造成記憶體不夠用(Memory Leak)的狀況,或者是重複釋放的問題

用自動管理記憶體的方式,程式語言可能無法完美辨別哪些物件不再使用,或者突然觸發垃圾回收機制,使應用程式跑到一半出現效能問題

Rust 使用新的方式(所有權)來管理記憶體,

所有權裡有 Move 以及 Borrow 的狀況,

我們在使用變數時可能會借用其他變數的值,甚至是轉移所有權,

而生命週期可以確保我們在借用或者轉移所有權的時候,原物主是仍然存在的,並且長久到執行時還存在

舉個例子來說,

小明跟小美同居,有一天他們簽了一個協議,

這個協議的內容是,每週小明要幫小美倒垃圾(小美向小明 Borrow 勞力),

有一天小明再也受不了,說他要分居(小明離開這個 Block),

當小明離開之後,小美再也無法享受小明勞力帶來的便利

我們用程式碼看看例子吧:

離開 Block 之後,在作用域中的變數生命就結束了

以下方例子來說,

a 的作用域在 main 中
b 的作用域在 block {} 中

可想而知 a 應該會活得比 b 還久

如果 a 今天在 block 中跟 b 借用,就會有問題,讓我們來看一下

fn main() {
    let a;
    {
        let b = ['c', 'd'];
        a = &b;
    }
    println!("{:?}", a)
}

執行後,我們來看一下訊息,

他寫著 b 活得不夠久

當 b 出了這個 {} b 的生命就結束了

這時候 a 想找也沒辦法找 b 借用

> cargo run

error[E0597]: `b` does not live long enough
 --> src/main.rs:5:13
  |
4 |         let b = ['c', 'd'];
  |             - binding `b` declared here
5 |         a = &b;
  |             ^^ borrowed value does not live long enough
6 |     }
  |     - `b` dropped here while still borrowed
7 |     println!("{:?}", a)
  |                      - borrow later used here

For more information about this error, try `rustc --explain E0597`.
error: could not compile `hello_world` (bin "hello_world") due to previous error

所有權轉移代表生命週期結束嗎?

這是兩回事,所有權的轉移只是將值的所有權轉嫁到別人身上,該變數所在的作用域還沒消失的話,該變數還是活著的

今天先介紹到這邊啦,我們明天再針對生命週期做更深的介紹


上一篇
Day 18 Ownership part 4
下一篇
Day 20 - 生命週期 part 2
系列文
成為程式界的 F1 賽車手,用 30 天認識 Rust 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
hello world
iT邦新手 5 級 ‧ 2023-10-04 21:36:14

比喻的很有趣 XDD

我要留言

立即登入留言