5 分鐘總結 Rust 生命週期
lifetime
壽命
Rust
中的每一個引用都有一個有效的作用域,生命週期就是爲這個作用域服務的,大部分生命週期編譯器可以推斷出來,可以是隱式的。但是如果在某些情況下編譯器就無法正常推斷出來了,需要我們自己手動標註,標註生命週期語法就是'a
這樣的語法。
爲什麼需要生命週期?
例如下面例子就是在兩個字符串切片裏面查找最長的那個並且返回!
// 'a 是指3個引用的作用域生命週期要一致
fn find_long_str<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
上面我就加註了生命週期標識符,如果不加編譯器會報錯,原因是因爲我們這個函數引用的是外部的變量,不能確定引用的變量是否已經被銷燬了,那這樣就是懸垂引用!
let str1 = String::from("Hello");
let str2;
let result;
{
//let str2 = String::from(" World!");
str2 = String::from(" World!");
result = find_long_str(str1.as_str(), &str2);
}
// 這裏借用檢測就提示 引用了已經銷燬的資源了
println!("{}", result);
大致過程圖
加了生命週期標識符之後,如果我把let str2 = String::from(" World!");
取消註釋放在一個內部作用域裏面定義,那麼這時調用find_long_str
編譯器就會報錯,因爲我在下面出了作用域還使用了find_long_str
返回的結果,而這個結果可能就是str2
的內容, 使用這個是違反了所有權規則的,str2
離開內部作用域就被銷燬了。
在標註生命週期fn find_long_str<'a>(x: &'a str, y: &'a str) -> &'a str
之後編譯器就知道輸入參數和返回參數生命週期是要一致的,並且返回值生命週期肯定是取生命週期最短的那個的。
總結
-
生命週期是確保被引用的值是有效的。
-
引用的生命週期肯定是小於或者等於資源所有者的。
-
如果是在函數里面創建的資源,應該是直接返回其所有權,而不是引用。
-
每個生命週期標註都有不同的生命週期,如果有輸入的生命週期,那麼輸出的生命週期也是一致的。
-
self
的生命週期會被賦給輸出的生命週期。
其他
-
當然上面是我剛剛入坑總結話,有錯誤地方望大佬指教!
-
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a868aa030fa934b22cd770727f42724d
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/EhFYlbw-s5jO8ZC4qMq6CA