RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于Rust語言中的生命周期

科技綠洲 ? 來源:TinyZ ? 作者:TinyZ ? 2023-09-19 17:03 ? 次閱讀

Rust是一門系統(tǒng)級編程語言具備高效、安和并發(fā)等特,而生命周期是這門語言中比較重要的概念之一。在這篇教程中,我們會了解什么是命周期、為什么需要生命周期、如何使用生命周期,同時我們依然會使用老朋友Animal的代碼示例。

生命周期

生命周期是Rust語言中的一個概念,用于決內(nèi)存安全問題。我們在Rust中定義一個變量時,需要確定這個變量在內(nèi)存中存儲時長。這存儲時長需要在編譯時確定,而生命周期就是來描述這個存儲長的。

在Rust中,所有變量都有一個生命周期,生命周期描述了這個變量在存中存在的時長。決定這個變量在什時候被創(chuàng)建和銷毀,以及在什么時候可以被訪問和修改生命周期可以是顯式也可以是隱式的,但是的生命周期都必須循一些規(guī)則,以確保代碼的正確性和全性。

在C/C++等編語言中,內(nèi)存管理是程序員需要自己負(fù)責(zé)的。在這些語言中,程序需要手動分配和放內(nèi)存,這方式非常容易出現(xiàn)內(nèi)存泄漏、內(nèi)溢出等問題。而在Rust中,生命周期的引入使得內(nèi)存安全問題得到了有效的解決。通過生命周期的束縛,Rust可以在編譯時檢查變量的存儲時長是否合法,從而避免了許多內(nèi)存安全問題。

生命周期的基本概念

在Rust中,生命周期的基本概念包括三個部分,分別是: 生命周期標(biāo)注 、 生命周期參數(shù)生命周期忽略

生命周期標(biāo)注

生命周期標(biāo)(lifetime annotation)是指在變量、函數(shù)結(jié)構(gòu)體等 定義中入生命周期參數(shù)。命周期標(biāo)注使用單引( ' )表示。

&i32        // 一個引用
&'a i32     // 具有顯式生命周期的引用
&'a mut i32 // 具有顯式生命周期的可變引用

以Animal為例定義一個結(jié)構(gòu)體, 示例如下:

#[derive(Debug)]
struct Animal< 'a > {
    name: &'a str,
    age: i32
}

上述中,我們在Animal結(jié)構(gòu)體中加入了生命周期標(biāo)注表示Animal結(jié)構(gòu)體中的字段的生命周期與結(jié)構(gòu)體身的生命周期相同。

生命周期參數(shù)

生命周期參數(shù)(lifetime parameter)是指在函數(shù)或結(jié)構(gòu)定義中聲明的生命周期參數(shù)。例如:

fn find_oldest< 'a >(animals: &'a [Animal]) - >&'a Animal< 'a > {
    let mut oldest = &animals[0];
    for animal in animals {
        if animal.age > oldest.age {
            oldest = animal;
        }
    }
    oldest
}
fn main() {
    let list = &vec![Animal{name:"x", age:1},];
    let animal = find_oldest(list);
    println!("{:?}", animal);
}
//  輸出結(jié)果:
//  Animal { name: "x", age: 1 }

上述代碼,我們在find_oldest函數(shù)定義中聲明了一個生命周期參數(shù)'a,表示函數(shù)返回的Animal對象的生命周期與的動物列表的命周期相同。

生命周期省略

Rust設(shè)計了一套生命周期省略規(guī)則,允許開發(fā)者在某些情況下可以不顯式地指定生命周期。這是通過對變量引用和函數(shù)參數(shù)等上下文的分析得出的結(jié)果。生命周期省略的規(guī)則復(fù)雜而嚴(yán)謹(jǐn),可以極大地減少代碼的書寫量,同時又保證了程序的正確性。

需要注意的是,雖然生命周期省略允許省略生命周期注釋,但對于某些特殊情況,為了保證代碼的清晰和正確性,仍需要顯式地指定生命周期。

Rust中的生命周期省略規(guī)則主要有三種情況:

    1. 對于只有一個輸入生命周期參數(shù)的函數(shù):函數(shù)參數(shù)的生命周期將被賦予所有輸出生命周期參數(shù)。

例如:

fn foo< 'a >(x: &'a i32) - > &'a i32 { x }

這里定義了一個名為foo的函數(shù),它只有一個輸入生命周期參數(shù)'a。因此,在返回值中可以省略'a,因為'a是唯一的輸入生命周期參數(shù)。因此,上述代碼可以簡化為:

fn foo(x: &i32) - > &i32 { x }
    1. 對于方法:方法的所有輸入生命周期參數(shù)都將被賦予方法的輸出生命周期參數(shù)。

例如:

#[derive(Debug)]
struct Foo< 'a > {
    x: &'a i32,
}
fn bar< 'a >(foo: &'a Foo) - > &'a i32 {
    foo.x
}
fn main() {
    let v = 2;
    let f = Foo { 
        x: &v,
    };
    println!("{:?}, {:?}", f, bar(&f));
}
//    輸出結(jié)果:
//  Foo { x: 2 }, 2

這里定義了一個名為Foo的結(jié)構(gòu)體,并在其內(nèi)部實現(xiàn)了一個方法bar。由于該結(jié)構(gòu)體定義了生命周期參數(shù)'a,因此結(jié)構(gòu)體的所有方法也需要使用相同的生命周期參數(shù),生命周期省略規(guī)則允許我們在方法中不指定引用的生命周期。因此,上述代碼可以簡化為:

#[derive(Debug)]
struct Foo< 'a > {
    x: &'a i32,
}
impl< 'a > Foo< 'a > {
    // 省略了生命周期參數(shù)'a'
    fn bar(&self) - > &i32 { self.x }  
}
    1. 對于具有多個輸入生命周期參數(shù)的函數(shù)或方法:輸入生命周期參數(shù)中,一個引用類型參數(shù)的生命周期被賦予所有其他引用類型參數(shù)的生命周期。

例如:

fn foo< 'a, 'b >(x: &'a i32, y: &'b i32) - > &i32 {
    if *x < *y { x } else { y }
}

這里定義了一個名為foo的函數(shù),它有兩個輸入生命周期參數(shù)'a'b。根據(jù)生命周期省略規(guī)則,當(dāng)存在多個輸入生命周期參數(shù)時,編譯器會嘗試尋找一條最短的路徑來使所有引用的生命周期參數(shù)保持有效,而這一路徑就是將引用的生命周期參數(shù)設(shè)為交集,即對于兩個輸入生命周期參數(shù)'a'b,取它們的交集'a & 'b作為函數(shù)返回值的生命周期參數(shù),因此,上述代碼可以簡化為:

// 省略了生命周期參數(shù)'a'和'b'
fn foo(x: &i32, y: &i32) - > &i32 {  
    if *x < *y { x } else { y }
}

生命周期消除

靜態(tài)生命周期

在 Rust 中,靜態(tài)生命周期(static lifetime)由 'static 來表示。它是一種特殊的生命周期,只有在程序運行時才會被初始化,而不是在執(zhí)行函數(shù)時。一個擁有 'static 生命周期的變量可以在整個程序運行期間存在,因此它們需要分配在靜態(tài)內(nèi)存區(qū)域,直到程序終止才會被釋放。

示例代碼

下面是一個完整的示例代碼,演示了生命周期在Zoo中的使用:

#[derive(Debug)]
struct Animal< 'a > {
    name: &'a str,
    age: i32,
}

struct Zoo< 'a > {
    animals: &'a [Animal< 'a >],
}

impl< 'a > Zoo< 'a > {
    fn new(animals: &'a [Animal< 'a >]) - > Zoo< 'a > {
        Zoo { animals }
    }

    fn get_oldest(&self) - > &'a Animal< 'a > {
        let mut oldest = &self.animals[0];
        for animal in self.animals {
            if animal.age > oldest.age {
                oldest = animal;
            }
        }
        oldest
    }
}

fn main() {
    let animal1 = Animal { name: "cat", age: 5 };
    let animal2 = Animal { name: "dog", age: 7 };
    let animal3 = Animal { name: "bird", age: 2 };

    let list = vec![animal1, animal2, animal3];
    let animal_list = Zoo::new(&list);
    let oldest_animal = animal_list.get_oldest();
    println!("The oldest animal is {} its age is {}", oldest_animal.name, oldest_animal.age);
}
//  輸出
//  The oldest animal is dog its age is 7

在上述中,我們定義了Animal和Zoo兩個結(jié)構(gòu)體,分別表示物和動物列表。List中包含一個animals字段,類型為&'a [Animal<'a>]表示動物列表的生命周期與Zoo實例的生命周期相同。Zoo中,我們定義了兩個方法:new和get_oldest。new通過傳入的動物列表構(gòu)造了一個Zoo實例。get_ol方法用于查找動物列表最大的年齡,并返回對應(yīng)的動物對象。在main函數(shù)中,我們創(chuàng)建了三個Animal對象,并通過三個對象構(gòu)造了一個Zoo實例接著,我們調(diào)用Zoo的get_oldest方法,得到了最大年齡的動物。最后,我們輸出了這個動的名稱和年齡。

總結(jié)

生命周期是Rust語言中重要的概念之一,用于描述引用的生命周期。函數(shù)中,我們可以使用生標(biāo)注來描述參數(shù)和返回值的生命周期關(guān)系。在結(jié)構(gòu)中,我們可以使用生命周期標(biāo)注來描述字段的生命周期關(guān)系在某些情況下,我們可以通過生命周期省略來簡化代碼,提高可性。生命周期的正確使用是寫出高效、可讀性強Rust程序的關(guān)鍵之一。

希望本篇文章能幫助讀者更好地理解Rust中的生命周期概念,以及如何在代碼中正確使用和省略生命周期。同時,本文也給出了一個完整的示例代碼希望讀者能夠通過實踐加深對生命周期的理解。

在實際開發(fā)中,生命周期的正確使用非常重要的它不僅關(guān)系到代碼的性,也關(guān)系到程序的性能和可讀性。因,程序員需要認(rèn)真習(xí)和掌握Rust中的命周期概念,正確使用生命周期來編寫高效、可讀性強的代碼。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3019

    瀏覽量

    74002
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1942

    瀏覽量

    34707
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3785

    瀏覽量

    81001
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    657

    瀏覽量

    32852
  • rust語言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    3009
收藏 人收藏

    評論

    相關(guān)推薦

    C語言里變量的生命周期

    在C語言中,變量的生命周期指的是該變量存在的時間段,理解變量的內(nèi)存釋放時機,設(shè)計程序才能少出問題。
    的頭像 發(fā)表于 07-11 09:12 ?1450次閱讀
    C<b class='flag-5'>語言</b>里變量的<b class='flag-5'>生命周期</b>

    Rust語言中錯誤處理的機制

    Rust語言中,錯誤處理是一項非常重要的任務(wù)。由于Rust語言采用靜態(tài)類型檢查,在編譯時就能發(fā)現(xiàn)很多潛在的錯誤,這使得程序員能夠更加自信和高效地開發(fā)程序。然而,即使我們在編譯時盡可能
    的頭像 發(fā)表于 09-19 14:54 ?1404次閱讀

    AutoScaling 生命周期掛鉤功能

    摘要: AutoScaling 伸縮組實例管理功能全面升級,新上線生命周期掛鉤(LifecycleHook)功能,方便用戶更加靈活地管理伸縮組內(nèi)實例。使用生命周期掛鉤可以在伸縮組發(fā)生伸縮活動時將伸縮
    發(fā)表于 06-27 17:13

    HarmonyOS應(yīng)用開發(fā)-PageAbility生命周期

    pageAbility的生命周期如下圖所示:在代碼中通過調(diào)用下列方法實現(xiàn)生命周期操作:onShow() :Ability由后臺不可見狀態(tài)切換到前臺可見狀態(tài)調(diào)用onShow方法,此時用戶在屏幕可以看到
    發(fā)表于 10-17 11:11

    在S32G2 RM中有“生命周期”,生命周期的完整含義是什么?

    在S32G2 RM中,有“生命周期”。生命周期的完整含義是什么,我們應(yīng)該如何使用它?
    發(fā)表于 04-23 10:37

    貫穿于全生命周期的功能安全

    簡要介紹了功能安全在SIS 全安全生命周期的主要活動,敘述了全生命周期的功能安全管理。簡要闡述了貫穿于整體安全生命周期的功能安全進(jìn)行的主要階段,同時提出了在設(shè)計SIS 時
    發(fā)表于 01-06 17:11 ?6次下載

    一文讀懂Android Activity生命周期

    正常情況下Activity的生命周期: Activity的生命周期大概可以歸為三部分 整個的生命周期:onCreate()可以設(shè)置所有的“全局”狀態(tài), onDestory()可以釋放所有的資源 可見
    發(fā)表于 05-30 01:03 ?1583次閱讀

    基于延長WSN生命周期的LEACH算法的改進(jìn)

    基于延長WSN生命周期的LEACH算法的改進(jìn)(開關(guān)電源技術(shù)與設(shè)計pdf百度云)-基于延長WSN生命周期的LEACH算法的改進(jìn)? ? ? ? ? ? ? ? ? ??
    發(fā)表于 09-15 11:17 ?14次下載
    基于延長WSN<b class='flag-5'>生命周期</b>的LEACH算法的改進(jìn)

    Synopsys 啟動硅生命周期管理計劃

    Synopsis 的數(shù)據(jù)分析驅(qū)動的硅生命周期管理計劃解決了 IC 生命周期中的質(zhì)量、可靠性和安全挑戰(zhàn)。
    發(fā)表于 08-18 15:37 ?840次閱讀
    Synopsys 啟動硅<b class='flag-5'>生命周期</b>管理計劃

    Vue入門Vue的生命周期

    .生命周期 4.1生命周期是什么 Vue的生命周期, 就是Vue實例從創(chuàng)建到銷毀的過程.
    的頭像 發(fā)表于 02-06 16:16 ?855次閱讀
    Vue入門Vue的<b class='flag-5'>生命周期</b>

    編譯器的標(biāo)準(zhǔn)生命周期

    編譯器的標(biāo)準(zhǔn)生命周期
    發(fā)表于 03-14 19:06 ?0次下載
    編譯器的標(biāo)準(zhǔn)<b class='flag-5'>生命周期</b>

    編譯器的標(biāo)準(zhǔn)生命周期

    編譯器的標(biāo)準(zhǔn)生命周期
    發(fā)表于 07-05 19:32 ?1次下載
    編譯器的標(biāo)準(zhǔn)<b class='flag-5'>生命周期</b>

    數(shù)據(jù)包的生命周期

    電子發(fā)燒友網(wǎng)站提供《數(shù)據(jù)包的生命周期.pdf》資料免費下載
    發(fā)表于 10-13 14:44 ?0次下載

    鴻蒙開發(fā):【PageAbility的生命周期

    PageAbility生命周期是PageAbility被調(diào)度到INACTIVE、ACTIVE、BACKGROUND等各個狀態(tài)的統(tǒng)稱。PageAbility生命周期流轉(zhuǎn)及狀態(tài)說明見如下圖1、表1所示。
    的頭像 發(fā)表于 06-17 10:05 ?691次閱讀
    鴻蒙開發(fā):【PageAbility的<b class='flag-5'>生命周期</b>】

    鴻蒙開發(fā)組件:DataAbility的生命周期

    應(yīng)用開發(fā)者可以根據(jù)業(yè)務(wù)場景實現(xiàn)data.js/data.ets中的生命周期相關(guān)接口。DataAbility生命周期接口說明見下表。
    的頭像 發(fā)表于 06-20 09:39 ?434次閱讀
    RM新时代网站-首页