生命週期指的是一個變數的出生與死亡,就字面上來看其實蠻白話的
看起來我們好像只要知道他什麼時候出生跟什麼時候死亡就好?
不過在 Rust 中其實沒這麼簡單
Rust 的生命週期跟所有權息息相關,
所謂的生命週期指的是這個變數活得久不久,夠不夠久
一個變數的開始是在我們定義他的時候,卻有很多種狀況結束
結束是什麼意思?指的是變數已經不存在於記憶體中了
生命週期用於追蹤變數的「有效期限」,避免參考到已被釋放或不再有效的資料,
這點也讓程式碼在編譯期間能保證這個程式碼是安全的,減少誤觸記憶體的地雷
有些程式語言會使用手動來管理記憶體,這樣可以掌握記憶體的使用狀況,不過缺點是可能會造成記憶體不夠用(Memory Leak)的狀況,或者是重複釋放的問題
用自動管理記憶體的方式,程式語言可能無法完美辨別哪些物件不再使用,或者突然觸發垃圾回收機制,使應用程式跑到一半出現效能問題
Rust 使用新的方式(所有權)來管理記憶體,
所有權裡有 Move 以及 Borrow 的狀況,
我們在使用變數時可能會借用其他變數的值,甚至是轉移所有權,
而生命週期可以確保我們在借用或者轉移所有權的時候,原物主是仍然存在的,並且長久到執行時還存在
舉個例子來說,
小明跟小美同居,有一天他們簽了一個協議,
這個協議的內容是,每週小明要幫小美倒垃圾(小美向小明 Borrow 勞力),
有一天小明再也受不了,說他要分居(小明離開這個 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
這是兩回事,所有權的轉移只是將值的所有權轉嫁到別人身上,該變數所在的作用域還沒消失的話,該變數還是活著的
今天先介紹到這邊啦,我們明天再針對生命週期做更深的介紹