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

深入了解Rust的生命周期

 更新時間:2022年12月14日 10:50:52   作者:閑魚翻不了身  
生命周期指的是引用保持有效的作用域,Rust的每個引用都有自己的生命周期。本文將通過示例和大家詳細說說Rust的生命周期,需要的可以參考一下

Rust生命周期簡介

Rust 中的每一個引用都有其 生命周期(lifetime),也就是引用保持有效的作用域。

生命周期的主要目標是避免懸垂引用,它會導致程序引用了非預期引用的數(shù)據(jù)。

{
    let r;
    {
        let x = 5;
        r = &x;
    }
	//x出作用域后已經(jīng)被刪除,發(fā)生懸垂引用
    println!("r: {}", r);
}

實現(xiàn)生命周期檢查的手段:Rust 編譯器有一個 借用檢查器(borrow checker),它比較作用域來確保所有的借用都是有效的。

//函數(shù)中的泛型生命周期
fn longest(x: &str, y: &str) -> &str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}
//該函數(shù)會發(fā)生編譯錯誤,因為 Rust 并不知道將要返回的引用是指向 x 或 y
//當我們定義這個函數(shù)的時候,并不知道傳遞給函數(shù)的具體值,所以也不知道到底是 if 還是 else 會被執(zhí)行。
//我們也不知道傳入的引用的具體生命周期,所以也就不能通過觀察作用域來確定返回的引用是否總是有效。
//借用檢查器自身同樣也無法確定,因為它不知道 x 和 y 的生命周期是如何與返回值的生命周期相關聯(lián)的。

生命周期標注語法:

生命周期語法是用于將函數(shù)的多個參數(shù)與其返回值的生命周期進行關聯(lián)的。一旦他們形成了某種關聯(lián),Rust 就有了足夠的信息來允許內存安全的操作并阻止會產(chǎn)生懸垂指針亦或是違反內存安全的行為。

Q:為什么有這個語法?

A:因為編譯器笨,借用檢查器不知道類似上述情況中的生命周期怎么比較,所以靠人手寫給他約束。

生命周期標注并不改變任何引用的生命周期的長短。與當函數(shù)簽名中指定了泛型類型參數(shù)后就可以接受任何類型一樣,當指定了泛型生命周期后函數(shù)也能接受任何生命周期的引用。生命周期標注描述了多個引用生命周期相互的關系,而不影響其生命周期。

生命周期標注有著一個不太常見的語法:生命周期參數(shù)名稱必須以撇號(')開頭,其名稱通常全是小寫,類似于泛型其名稱非常短。'a 是大多數(shù)人默認使用的名稱。生命周期參數(shù)標注位于引用的 & 之后,并有一個空格來將引用類型與生命周期標注分隔開。

//使用泛型生命周期標注語法解決上述問題
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}
//現(xiàn)在函數(shù)簽名表明對于某些生命周期 'a,函數(shù)會獲取兩個參數(shù),他們都是與生命周期 'a 存在的一樣長的字符串 slice。
//函數(shù)會返回一個同樣也與生命周期 'a 存在的一樣長的字符串 slice。
//它的實際含義是 longest 函數(shù)返回的引用的生命周期與傳入該函數(shù)的引用的生命周期的較小者一致。
//這就是我們告訴 Rust 需要其保證的約束條件。
//兩個直觀的例子
//1.正確示例:返回的引用生命周期與較小的string2一致,函數(shù)調用正確
fn main() {
    let string1 = String::from("long string is long");
    {
        let string2 = String::from("xyz");
        let result = longest(string1.as_str(), string2.as_str());
        println!("The longest string is {}", result);
    }
}
//2.錯誤示例:返回的引用生命周期與string2一致,但是println時,result引用生命周期已經(jīng)結束,編譯失敗
fn main() {
    let string1 = String::from("long string is long");
    let result;
    {
        let string2 = String::from("xyz");
        result = longest(string1.as_str(), string2.as_str());
    }
    println!("The longest string is {}", result);
}

類似的,結構體,方法中使用到引用時也可以使用生命周期標注語法。

題外話:Rust觀法有在盡力的減輕開發(fā)者負擔,一些很常見的需要生命周期標注的情況,編譯器已經(jīng)在內部實現(xiàn)好了,未來用戶只會越來越少的使用到生命周期標注語法。被Rust 官方考慮到的一些引用分析的模式被稱為 生命周期省略規(guī)則(lifetime elision rules)。

比較特殊的,'static,其生命周期能夠存活于整個程序期間。所有的字符串字面量都擁有 'static 生命周期。

//static生命周期
let s: &'static str = "I have a static lifetime.";

總結:

生命周期概念和大多數(shù)語言一樣,但Rust對變量生命周期的檢查是很具有特色的,還有他特別的生命周期標注語法是很性新穎的,能在編譯期處理的錯誤絕不留到運行時這是Rust很棒的設計理念.

到此這篇關于深入了解Rust的生命周期的文章就介紹到這了,更多相關Rust生命周期內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Rust?所有權機制原理深入剖析

    Rust?所有權機制原理深入剖析

    這篇文章主要為大家介紹了Rust?所有權機制原理深入剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Rust?實現(xiàn)?async/await的詳細代碼

    Rust?實現(xiàn)?async/await的詳細代碼

    異步編程在 Rust 中的地位非常高,很多 crate 尤其是多IO操作的都使用了 async/await,這篇文章主要介紹了Rust?如何實現(xiàn)?async/await,需要的朋友可以參考下
    2022-09-09
  • 詳解Rust中的workspace

    詳解Rust中的workspace

    這篇文章主要向大家介紹Rust中的workspace,主要內容包括基礎應用、實用技巧、原理機制等方面,這個概念在Rust中是通用的,只不過maven換成了cargo,而模塊變成了crate,下面跟著小編通過一個例子給大家介紹下
    2022-03-03
  • 如何使用rust實現(xiàn)簡單的單鏈表

    如何使用rust實現(xiàn)簡單的單鏈表

    實現(xiàn)單鏈表在別的語言里面可能是一件簡單的事情,單對于Rust來說,絕對不簡單,下面這篇文章主要給大家介紹了關于如何使用rust實現(xiàn)簡單的單鏈表的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Rust 語言中的dyn 關鍵字及用途解析

    Rust 語言中的dyn 關鍵字及用途解析

    在Rust中,"dyn"關鍵字用于表示動態(tài)分發(fā)(dynamic dispatch),它通常與trait對象一起使用,以實現(xiàn)運行時多態(tài), 在Rust中,多態(tài)是通過trait和impl來實現(xiàn)的,這篇文章主要介紹了Rust 語言中的 dyn 關鍵字,需要的朋友可以參考下
    2024-03-03
  • 一文掌握Rust編程中的生命周期

    一文掌握Rust編程中的生命周期

    在Rust語言中, 每一個引用都有其生命周期, 通俗講就是每個引用在程序執(zhí)行的過程中都有其自身的作用域, 一旦離開其作用域, 其生命周期也宣告結束, 值不再有效,這篇文章主要介紹了Rust編程中的生命周期,需要的朋友可以參考下
    2023-11-11
  • Rust裸指針的安全性實例講解

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

    裸指針是一個不包含所有權和借用關系的原始指針,它們與常規(guī)指針相比沒有任何限制和保護措施,這篇文章主要介紹了Rust裸指針的安全性實例,需要的朋友可以參考下
    2023-05-05
  • 淺談Rust?+=?運算符與?MIR?應用

    淺談Rust?+=?運算符與?MIR?應用

    這篇文章主要介紹了Rust?+=?運算符與?MIR?應用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • 利用Rust編寫一個簡單的字符串時鐘

    利用Rust編寫一個簡單的字符串時鐘

    這篇文章主要為大家詳細介紹了一個用rust寫的一個簡單的練手的demo,一個字符串時鐘,在終端用字符串方式顯示當前時間,感興趣的小伙伴可以了解一下
    2022-12-12
  • Rust中的模塊系統(tǒng)之控制作用域與私有性詳解

    Rust中的模塊系統(tǒng)之控制作用域與私有性詳解

    這篇文章總結了Rust模塊系統(tǒng)的基本規(guī)則,包括如何聲明模塊、路徑訪問、私有性與公開性,以及如何使用`use`關鍵字簡化路徑引用,通過一個餐廳系統(tǒng)示例,展示了如何利用模塊劃分功能,并介紹了如何在其他模塊或二進制crate中使用這些模塊
    2025-02-02

最新評論

江源县| 台山市| 平昌县| 克拉玛依市| 济阳县| 花莲市| 滨州市| 云和县| 邓州市| 定远县| 汝南县| 宁晋县| 玛沁县| 太康县| 太保市| 济阳县| 泰兴市| 延安市| 海林市| 池州市| 昂仁县| 兰坪| 普兰县| 承德县| 芜湖市| 建瓯市| 奎屯市| 大同县| 二连浩特市| 三门峡市| 绩溪县| 平罗县| 和政县| 五常市| 仁寿县| 潮州市| 纳雍县| 蒙阴县| 石楼县| 岚皋县| 荆门市|