最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文弄懂rust生命周期

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

一、生命期是什么

生命期,又叫生存期,就是變量的有效期。
實例1

{
    let r;
    {
        let x = 5;
        r = &x;
    }
    println!("r: {}", r);
}

編譯錯誤,原因是r所引用的值已經(jīng)被釋放。

在這里插入圖片描述

上圖中的綠色范圍’a表示r的生命期,藍(lán)色范圍’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不支持生命期自動判斷,所有的生命期必須嚴(yán)格聲明,但現(xiàn)在的Rust已經(jīng)支持了。

到此這篇關(guān)于一文弄懂rust生命周期的文章就介紹到這了,更多相關(guān)rust生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用vscode配置Rust運行環(huán)境全過程

    使用vscode配置Rust運行環(huán)境全過程

    VS Code對Rust有著較完備的支持,這篇文章主要給大家介紹了關(guān)于使用vscode配置Rust運行環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Rust裸指針的安全性實例講解

    Rust裸指針的安全性實例講解

    裸指針是一個不包含所有權(quán)和借用關(guān)系的原始指針,它們與常規(guī)指針相比沒有任何限制和保護(hù)措施,這篇文章主要介紹了Rust裸指針的安全性實例,需要的朋友可以參考下
    2023-05-05
  • Rust生命周期常見誤區(qū)(中英對照)全面指南

    Rust生命周期常見誤區(qū)(中英對照)全面指南

    這篇文章主要WEIDJAI?介紹了Rust生命周期常見誤區(qū)(中英對照)的全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Rust 函數(shù)式編程的具體使用

    Rust 函數(shù)式編程的具體使用

    本文主要介紹了Rust 函數(shù)式編程的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • Rust語言之Prometheus系統(tǒng)監(jiān)控工具包的使用詳解

    Rust語言之Prometheus系統(tǒng)監(jiān)控工具包的使用詳解

    Prometheus?是一個開源的系統(tǒng)監(jiān)控和警報工具包,最初是由SoundCloud構(gòu)建的,隨著時間的發(fā)展,Prometheus已經(jīng)具有適用于各種使用場景的版本,為了開發(fā)者方便開發(fā),更是有各種語言版本的Prometheus的開發(fā)工具包,本文主要介紹Rust版本的Prometheus開發(fā)工具包
    2023-10-10
  • rust實現(xiàn)post小程序(完整代碼)

    rust實現(xiàn)post小程序(完整代碼)

    這篇文章主要介紹了rust實現(xiàn)一個post小程序,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • MacBook Pro安裝rust編程環(huán)境的過程

    MacBook Pro安裝rust編程環(huán)境的過程

    rustup是一個用于管理Rust版本和工具鏈的工具,這篇文章主要介紹了MacBook Pro安裝rust編程環(huán)境的過程,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • Rust中Cargo的使用詳解

    Rust中Cargo的使用詳解

    Cargo 是 Rust 的構(gòu)建系統(tǒng)和包管理器,?多數(shù) Rustacean 們使? Cargo 來管理他們的 Rust 項?,因為它可以為你處理很多任務(wù),?如構(gòu)建代碼、下載依賴庫并編譯這些庫,這篇文章主要介紹了Rust中Cargo的使用,需要的朋友可以參考下
    2022-11-11
  • Rust使用Sled添加高性能嵌入式數(shù)據(jù)庫

    Rust使用Sled添加高性能嵌入式數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了如何在Rust項目中使用Sled庫,一個為Rust生態(tài)設(shè)計的現(xiàn)代、高性能嵌入式數(shù)據(jù)庫,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 基于Rust構(gòu)建一個Git提交歷史可視化工具

    基于Rust構(gòu)建一個Git提交歷史可視化工具

    在軟件開發(fā)中,版本控制系統(tǒng)的歷史記錄往往承載著項目的演進(jìn)脈絡(luò),本文主要介紹了如何基于Rust構(gòu)建一個Git提交歷史可視化工具,感興趣的小伙伴可以了解下
    2025-11-11

最新評論

康马县| 沐川县| 崇信县| 图们市| 游戏| 延安市| 虎林市| 勃利县| 乡宁县| 南投县| 突泉县| 固阳县| 池州市| 冷水江市| 常熟市| 微博| 苍溪县| 什邡市| 大洼县| 和田市| 安多县| 晋城| 平安县| 嘉义县| 常熟市| 堆龙德庆县| 布拖县| 巫溪县| 拜泉县| 临海市| 胶南市| 中西区| 石狮市| 望都县| 周宁县| 防城港市| 绵阳市| 三穗县| 黑山县| 新闻| 寿阳县|