一文弄懂rust生命周期
一、生命期是什么
生命期,又叫生存期,就是變量的有效期。
實例1
{ let r; { let x = 5; r = &x; } println!("r: {}", r); }
編譯錯誤,原因是r所引用的值已經(jīng)被釋放。
上圖中的綠色范圍’a表示r的生命期,藍色范圍’b表示x的生命期。
實例2
fn longer(s1: &String, s2: &String) -> &String { if s2.len() > s1.len() { s2 } else { s1 } } fn main() { let r; { let s1 = "rust".to_string(); let s2 = "ecmascript".to_string(); r = longer(&s1, &s2); } println!("{} is longer", r); }
longer函數(shù)取s1和s2兩個字符串較長的一個返回其引用值。但這段代碼不會通過編譯,原因是最后使用r的時候,s1和s2都已經(jīng)失效了。雖然可以把r的使用移到s1和s2的生命期以內(nèi)避免錯誤,但對于函數(shù)來說,它并不知道調(diào)用者如何使用它,所以為了保障自己傳遞出去的值始終是可使用的,就要消除一切危險,直接不能通過編譯。
所以下面代碼編譯錯誤
fn longer(s1: &String, s2: &String) -> &String { if s2.len() > s1.len() { s2 } else { s1 } } fn main() { let r; { let s1 = "rust".to_string(); let s2 = "ecmascript".to_string(); r = longer(&s1, &s2); println!("{} is longer", r); } }
二、標(biāo)明生命期
雖然生命期的含義是變量的有效期,但其實只應(yīng)用于引用。
一些場景,必須顯式標(biāo)明引用的生命期。
標(biāo)明生命期,并不是改變引用的有效期,只是顯式告訴編譯器引用的有效期。懸垂引用的問題還存在,還需要程序員自己處理。
(一)生命期注釋是標(biāo)明引用生命期的辦法。
語法格式:
用單引號開頭,跟著生命期名字:
&i32 // 常規(guī)引用 &'lifea i32 // 含有生命期注釋的引用 &'lifeb mut i32 // 含有生命期注釋的可變引用
(二)特殊生命期
'static
'static表示的生命期是從程序運行開始到程序運行結(jié)束。
所有字符串字面量都是 &'static str
三、使用生命期
(一)函數(shù)中使用生命期
改造longer函數(shù):
fn longer<'a>(s1: &'a String, s2: &'a String) -> &'a String { if s2.len() > s1.len() { s2 } else { s1 } } fn main() { let r; { let s1 = "rust".to_string(); let s2 = "ecmascript".to_string(); r = longer(&s1, &s2); println!("{} is longer", r); } }
我們把生命期作為泛型參數(shù),標(biāo)明函數(shù)返回值的生命期與兩個參數(shù)的生命期是一樣的,這樣就能編譯通過了。意思是只要返回值和參數(shù)的生命期一樣時,就能使用longer函數(shù)。
(二)結(jié)構(gòu)體中使用生命期
fn main() { struct Str<'a> { content: &'a str } let s = Str { content: "string_slice" }; println!("s.content = {}", s.content); } 方法定義 impl<'a> Str<'a> { fn get_content(&self) -> &str { self.content } }
這里返回值并沒有標(biāo)明生命期,但是加上也無妨。這是一個歷史問題,早期Rust不支持生命期自動判斷,所有的生命期必須嚴格聲明,但現(xiàn)在的Rust已經(jīng)支持了。
到此這篇關(guān)于一文弄懂rust生命周期的文章就介紹到這了,更多相關(guān)rust生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust中用enum實現(xiàn)多參數(shù)Hook機制完整代碼
在 Rust 中,如果想為enum實現(xiàn)一個帶多參數(shù)的 Hook 機制,可以結(jié)合模式匹配和枚舉來處理,這種方式可以擴展到支持不同類型的輸入?yún)?shù)和邏輯處理,下面通過示例代碼介紹Rust中用enum實現(xiàn)多參數(shù)Hook機制,感興趣的朋友一起看看吧2024-12-12Rust-使用dotenvy加載和使用環(huán)境變量的過程詳解
系統(tǒng)的開發(fā),測試和部署離不開環(huán)境變量,今天分享在Rust的系統(tǒng)開發(fā)中,使用dotenvy來讀取和使用環(huán)境變量,感興趣的朋友跟隨小編一起看看吧2023-11-11rust多個mod文件引用和文件夾mod使用注意事項小結(jié)
在 Rust 項目中,可以使用 mod 關(guān)鍵字將一個文件夾或一個 rs 文件作為一個模塊引入到當(dāng)前文件中,本文給大家介紹rust多個mod文件引用和文件夾mod使用注意事項小結(jié),感興趣的朋友跟隨小編一起看看吧2024-03-03Rust中類型轉(zhuǎn)換在錯誤處理中的應(yīng)用小結(jié)
隨著項目的進展,關(guān)于Rust的故事又翻開了新的一頁,今天來到了服務(wù)器端的開發(fā)場景,發(fā)現(xiàn)錯誤處理中的錯誤類型轉(zhuǎn)換有必要分享一下,對Rust錯誤處理相關(guān)知識感興趣的朋友一起看看吧2023-09-09