欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文弄懂rust生命周期

 更新時(shí)間:2023年12月07日 15:07:19   作者:int8  
生命周期是Rust語(yǔ)言中的一個(gè)概念,用于決內(nèi)存安全問(wèn)題,本文主要介紹了一文弄懂rust生命周期,具有一定的參考價(jià)值,感興趣的可以了解一下

一、生命期是什么

生命期,又叫生存期,就是變量的有效期。
實(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)文章

  • 詳解Rust中的所有權(quán)機(jī)制

    詳解Rust中的所有權(quán)機(jī)制

    Rust?語(yǔ)言提供了跟其他系統(tǒng)編程語(yǔ)言相同的方式來(lái)控制你使用的內(nèi)存,但擁有數(shù)據(jù)所有者在離開(kāi)作用域后自動(dòng)清除其數(shù)據(jù)的功能意味著你無(wú)須額外編寫(xiě)和調(diào)試相關(guān)的控制代碼,這篇文章主要介紹了Rust中的所有權(quán)機(jī)制,需要的朋友可以參考下
    2022-10-10
  • Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制完整代碼

    Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制完整代碼

    在 Rust 中,如果想為enum實(shí)現(xiàn)一個(gè)帶多參數(shù)的 Hook 機(jī)制,可以結(jié)合模式匹配和枚舉來(lái)處理,這種方式可以擴(kuò)展到支持不同類(lèi)型的輸入?yún)?shù)和邏輯處理,下面通過(guò)示例代碼介紹Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制,感興趣的朋友一起看看吧
    2024-12-12
  • Rust-使用dotenvy加載和使用環(huán)境變量的過(guò)程詳解

    Rust-使用dotenvy加載和使用環(huán)境變量的過(guò)程詳解

    系統(tǒng)的開(kāi)發(fā),測(cè)試和部署離不開(kāi)環(huán)境變量,今天分享在Rust的系統(tǒng)開(kāi)發(fā)中,使用dotenvy來(lái)讀取和使用環(huán)境變量,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • 如何基于Rust實(shí)現(xiàn)文本搜索minigrep

    如何基于Rust實(shí)現(xiàn)文本搜索minigrep

    這篇文章主要介紹了基于Rust實(shí)現(xiàn)的文本搜索minigrep,本次演示介紹針對(duì)原作者代碼程序的查詢(xún)邏輯做了一點(diǎn)點(diǎn)小的優(yōu)化,原程序邏輯的查詢(xún)是放在了程序運(yùn)行的時(shí)候,邏輯修改后啟動(dòng)的時(shí)候可以添加參數(shù),也可以啟動(dòng)后添加,需要的朋友可以參考下
    2024-08-08
  • 利用Rust編寫(xiě)一個(gè)簡(jiǎn)單的字符串時(shí)鐘

    利用Rust編寫(xiě)一個(gè)簡(jiǎn)單的字符串時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了一個(gè)用rust寫(xiě)的一個(gè)簡(jiǎn)單的練手的demo,一個(gè)字符串時(shí)鐘,在終端用字符串方式顯示當(dāng)前時(shí)間,感興趣的小伙伴可以了解一下
    2022-12-12
  • rust多個(gè)mod文件引用和文件夾mod使用注意事項(xiàng)小結(jié)

    rust多個(gè)mod文件引用和文件夾mod使用注意事項(xiàng)小結(jié)

    在 Rust 項(xiàng)目中,可以使用 mod 關(guān)鍵字將一個(gè)文件夾或一個(gè) rs 文件作為一個(gè)模塊引入到當(dāng)前文件中,本文給大家介紹rust多個(gè)mod文件引用和文件夾mod使用注意事項(xiàng)小結(jié),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • rust的package,crate,module示例解析

    rust的package,crate,module示例解析

    rust提供了非常優(yōu)秀的包管理器cargo,我們可以使用crate,module,package來(lái)組織代碼,這篇文章主要介紹了rust的package,crate,module相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Rust中類(lèi)型轉(zhuǎn)換在錯(cuò)誤處理中的應(yīng)用小結(jié)

    Rust中類(lèi)型轉(zhuǎn)換在錯(cuò)誤處理中的應(yīng)用小結(jié)

    隨著項(xiàng)目的進(jìn)展,關(guān)于Rust的故事又翻開(kāi)了新的一頁(yè),今天來(lái)到了服務(wù)器端的開(kāi)發(fā)場(chǎng)景,發(fā)現(xiàn)錯(cuò)誤處理中的錯(cuò)誤類(lèi)型轉(zhuǎn)換有必要分享一下,對(duì)Rust錯(cuò)誤處理相關(guān)知識(shí)感興趣的朋友一起看看吧
    2023-09-09
  • Rust?Postgres實(shí)例代碼

    Rust?Postgres實(shí)例代碼

    Rust Postgres是一個(gè)純Rust實(shí)現(xiàn)的PostgreSQL客戶(hù)端庫(kù),本文主要介紹了Rust?Postgres實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Rust處理錯(cuò)誤的實(shí)現(xiàn)方法

    Rust處理錯(cuò)誤的實(shí)現(xiàn)方法

    程序在運(yùn)行的過(guò)程中,總是會(huì)不可避免地產(chǎn)生錯(cuò)誤,而如何優(yōu)雅地解決錯(cuò)誤,也是語(yǔ)言的設(shè)計(jì)哲學(xué)之一。本文就來(lái)和大家來(lái)了Rust是如何處理錯(cuò)誤的,感興趣的可以了解一下
    2023-03-03

最新評(píng)論