一文弄懂rust生命周期
一、生命期是什么
生命期,又叫生存期,就是變量的有效期。
實(shí)例1
{
let r;
{
let x = 5;
r = &x;
}
println!("r: {}", r);
}
編譯錯(cuò)誤,原因是r所引用的值已經(jīng)被釋放。

上圖中的綠色范圍’a表示r的生命期,藍(lán)色范圍’b表示x的生命期。
實(shí)例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兩個(gè)字符串較長(zhǎng)的一個(gè)返回其引用值。但這段代碼不會(huì)通過(guò)編譯,原因是最后使用r的時(shí)候,s1和s2都已經(jīng)失效了。雖然可以把r的使用移到s1和s2的生命期以?xún)?nèi)避免錯(cuò)誤,但對(duì)于函數(shù)來(lái)說(shuō),它并不知道調(diào)用者如何使用它,所以為了保障自己傳遞出去的值始終是可使用的,就要消除一切危險(xiǎn),直接不能通過(guò)編譯。
所以下面代碼編譯錯(cuò)誤
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)明生命期
雖然生命期的含義是變量的有效期,但其實(shí)只應(yīng)用于引用。
一些場(chǎng)景,必須顯式標(biāo)明引用的生命期。
標(biāo)明生命期,并不是改變引用的有效期,只是顯式告訴編譯器引用的有效期。懸垂引用的問(wèn)題還存在,還需要程序員自己處理。
(一)生命期注釋是標(biāo)明引用生命期的辦法。
語(yǔ)法格式:
用單引號(hào)開(kāi)頭,跟著生命期名字:
&i32 // 常規(guī)引用 &'lifea i32 // 含有生命期注釋的引用 &'lifeb mut i32 // 含有生命期注釋的可變引用
(二)特殊生命期
'static
'static表示的生命期是從程序運(yùn)行開(kāi)始到程序運(yùn)行結(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ù)返回值的生命期與兩個(gè)參數(shù)的生命期是一樣的,這樣就能編譯通過(guò)了。意思是只要返回值和參數(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
}
}
這里返回值并沒(méi)有標(biāo)明生命期,但是加上也無(wú)妨。這是一個(gè)歷史問(wèn)題,早期Rust不支持生命期自動(dòng)判斷,所有的生命期必須嚴(yán)格聲明,但現(xiàn)在的Rust已經(jīng)支持了。
到此這篇關(guān)于一文弄懂rust生命周期的文章就介紹到這了,更多相關(guān)rust生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用vscode配置Rust運(yùn)行環(huán)境全過(guò)程
VS Code對(duì)Rust有著較完備的支持,這篇文章主要給大家介紹了關(guān)于使用vscode配置Rust運(yùn)行環(huán)境的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
Rust生命周期常見(jiàn)誤區(qū)(中英對(duì)照)全面指南
這篇文章主要WEIDJAI?介紹了Rust生命周期常見(jiàn)誤區(qū)(中英對(duì)照)的全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Rust語(yǔ)言之Prometheus系統(tǒng)監(jiān)控工具包的使用詳解
Prometheus?是一個(gè)開(kāi)源的系統(tǒng)監(jiān)控和警報(bào)工具包,最初是由SoundCloud構(gòu)建的,隨著時(shí)間的發(fā)展,Prometheus已經(jīng)具有適用于各種使用場(chǎng)景的版本,為了開(kāi)發(fā)者方便開(kāi)發(fā),更是有各種語(yǔ)言版本的Prometheus的開(kāi)發(fā)工具包,本文主要介紹Rust版本的Prometheus開(kāi)發(fā)工具包2023-10-10
rust實(shí)現(xiàn)post小程序(完整代碼)
這篇文章主要介紹了rust實(shí)現(xiàn)一個(gè)post小程序,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-04-04
MacBook Pro安裝rust編程環(huán)境的過(guò)程
rustup是一個(gè)用于管理Rust版本和工具鏈的工具,這篇文章主要介紹了MacBook Pro安裝rust編程環(huán)境的過(guò)程,感興趣的朋友跟隨小編一起看看吧2024-02-02
Rust使用Sled添加高性能嵌入式數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了如何在Rust項(xiàng)目中使用Sled庫(kù),一個(gè)為Rust生態(tài)設(shè)計(jì)的現(xiàn)代、高性能嵌入式數(shù)據(jù)庫(kù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
基于Rust構(gòu)建一個(gè)Git提交歷史可視化工具
在軟件開(kāi)發(fā)中,版本控制系統(tǒng)的歷史記錄往往承載著項(xiàng)目的演進(jìn)脈絡(luò),本文主要介紹了如何基于Rust構(gòu)建一個(gè)Git提交歷史可視化工具,感興趣的小伙伴可以了解下2025-11-11

