精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解Rust編程中的生命周期

開發(fā)
在本篇文章中我們探索了生命周期在Rust常見場(chǎng)景中的各種應(yīng)用, 但在復(fù)雜的業(yè)務(wù)場(chǎng)景中, 可能還會(huì)遇到其它錯(cuò)誤。

1.摘要

生命周期在Rust編程中是一個(gè)重要概念, 它能確保引用像預(yù)期的那樣一直有效。在Rust語(yǔ)言中, 每一個(gè)引用都有其生命周期, 通俗講就是每個(gè)引用在程序執(zhí)行的過(guò)程中都有其自身的作用域, 一旦離開其作用域, 其生命周期也宣告結(jié)束, 值不再有效。

幸運(yùn)的是, 在絕大多數(shù)時(shí)間里, 生命周期是隱含且可以進(jìn)行推斷的, 類似于當(dāng)有多種可能的類型時(shí)必須注明類型, 正因?yàn)槿绱? 所以Rust需要使用者使用泛型生命周期參數(shù)來(lái)注明它們的關(guān)系, 從而確保程序運(yùn)行時(shí)實(shí)際使用的引用絕對(duì)有效。

2.懸垂引用問題

懸垂引用會(huì)導(dǎo)致Rust編程中出現(xiàn)一些潛在的安全問題, 例如: 程序在無(wú)意之中引用了非預(yù)期引用的數(shù)據(jù), 而這種現(xiàn)象在沒有任何約束的情況下很容易出現(xiàn)。Rust編程中引入生命周期的主要原因就是避免編程過(guò)程中出現(xiàn)的懸垂引用問題。

下面看一個(gè)代碼示例:

fn main() {
   let num;
   {
      let count = 5;
      num = &count;
   }
   println!("num: {}", num);
}

首先定義了一個(gè)變量num, 下面的花括號(hào)表示進(jìn)入到一個(gè)作用域, 在該作用域中, 定義了一個(gè)變量count,并賦值為5, 在這個(gè)內(nèi)部作用域中,&count表示一個(gè)對(duì)變量count的引用, 然后將其賦給變量num, 在作用域的外部, 調(diào)用println打印出num的值。

先嘗試編譯一下這段代碼試試:

Rust編譯器報(bào)錯(cuò)的地方指向代碼: num = &count, 并報(bào)了一個(gè)錯(cuò)誤:"borrowed value does not live long enough", 意思是&count的值并沒有存在足夠久, 并很貼心的用藍(lán)色字告訴我們作用域的范圍界定。那么有一個(gè)問題, Rust編譯器是以什么機(jī)制來(lái)判定作用域使用的合法性呢?

3.Rust檢查機(jī)制

在Rust編譯器中, 有一個(gè)被稱為借用檢查器的機(jī)制, 它的主要工作原理是通過(guò)比較作用域來(lái)確保代碼中所有的借用都是有效的, 看一下下面的代碼標(biāo)識(shí):

fn main() {
   let num; ------------------------- num_s
   { |
      let count = 5; ------ count_s |
      num = &count; --------- |
   } |
   println!("num: {}", num);------------
}

這里將上面代碼中的兩個(gè)關(guān)鍵變量num和count分別引入一個(gè)各自代表其生命周期的標(biāo)識(shí):num_s和count_s。很明顯可以看到, num變量的起點(diǎn)在作用域上面, 終點(diǎn)在作用域下面,。而count_s的生命周期起點(diǎn)在進(jìn)入第一個(gè)花括號(hào)后面, 終點(diǎn)在第二個(gè)花括號(hào)前面, 也就是說(shuō), num變量的生命周期num_s包含了count_s的生命周期, 所以Rust編譯器利用借用檢查器比較兩個(gè)變量的生命周期大小, 很容易推斷出num的生命周期明顯要長(zhǎng)。

上面的代碼被Rust編譯器拒絕編譯, 正是因?yàn)榻栌脵z查器首先發(fā)現(xiàn) num_s的生命周期比count_s要長(zhǎng), 而num = &count這句代碼, 被引用的對(duì)象&count比引用者num存在的時(shí)間更短, 因此產(chǎn)生了懸垂引用。

那么解決該問題的方式也比較簡(jiǎn)單, 只要被引用對(duì)象和引用者處于同一作用域即可解決, 如下代碼:

方式一:

fn main() {
   let count = 5;
   let num = &count;
   println!("num: {}", num);
}

方式二:

fn main() {
    let num;
    {
        let count = 5;
        num = &count;
        println!("num: {}", num);
    }
}

4.泛型生命周期

下面有一段代碼, 主要完成了兩個(gè)字符串的長(zhǎng)度比較功能, 其中compare函數(shù)負(fù)責(zé)完成兩個(gè)字符串的長(zhǎng)度比較并返回長(zhǎng)度最長(zhǎng)的字符串的

切片。代碼如下:

fn compare(a: &str, b: &str) -> &str {
    if a.len() > b.len() {
       a
    } else {
       b
    }
}
fn main() {
   let sample1 = String::from("sample for suntiger");
   let sample2 = "suntiger";
   
   let c_result = compare(sample1.as_str(), sample2);
   println!("最長(zhǎng)的字符串是 {}", c_result);
}

這段代碼編譯時(shí),Rust編譯器的返回如下:

上面的錯(cuò)誤提示分為三個(gè)部分: compare函數(shù)的兩個(gè)參數(shù)以及返回值存在生命周期問題。首先, Rust編譯器并不清楚將要返回的引用&str到底是指向參數(shù)a還是參數(shù)b, 其實(shí)作為程序員自己也是不知道的, 因?yàn)橹挥性谶\(yùn)行時(shí)通過(guò)比較兩個(gè)參數(shù)的長(zhǎng)度大小后才知道哪個(gè)參數(shù)切片的字符串內(nèi)容更長(zhǎng)。

因此, 根據(jù)Rust編譯器的綠色標(biāo)記提示, 在編寫compare函數(shù)時(shí), 必須增加泛型生命周期參數(shù)來(lái)定義引用間的關(guān)系以便Rust的檢查機(jī)制能夠正確分析。

5.生命周期注解

在上面的編譯器返回提示中, 綠色的部分: <'a>、&'a被稱為生命周期注解, 這個(gè)也是Rust語(yǔ)言獨(dú)特的語(yǔ)法, 看起來(lái)比較奇葩和抽象, 那么Rust如何去定義這個(gè)注解呢, 以下是簡(jiǎn)單的語(yǔ)法:

&str // 稱為引用
&'a str // 稱為帶有顯式生命周期的引用
&'a mut str // 稱為帶有顯式生命周期的可變引用

生命周期注解的一個(gè)重要作用就是告訴Rust編譯器在多個(gè)引用的泛型生命周期參數(shù)存在期間它們?nèi)绾蜗嗷ヂ?lián)系。

嘗試將compare函數(shù)代碼修改如下:

fn compare<'a>(a: &'a str, b: &'a str) -> &'a str {
    if a.len() > b.len() {
       a
    } else {
       b
    }
}

再次嘗試編譯, Rust編譯器返回如下:

這次返回了正確的結(jié)果, 當(dāng)在函數(shù)中使用生命周期注解時(shí), 這些注解只存在于函數(shù)簽名中, 而不存在于函數(shù)體的任何代碼中, 當(dāng)在實(shí)際應(yīng)用過(guò)程中, 參數(shù)的引用傳給compare函數(shù)時(shí), 被'a取代的具體生命周期是參數(shù)a的作用域與參數(shù)b的作用域重疊的那一部分, 換句話說(shuō)就是兩個(gè)參數(shù)中生命周期較小的那一個(gè)。

6.結(jié)構(gòu)體生命周期注解

在定義結(jié)構(gòu)體時(shí), 也要在相應(yīng)的地方加上生命周期注解, 結(jié)構(gòu)體定義如下:

struct PersonInfo<'a> {
    name: &'a str,
}

在該結(jié)構(gòu)體中定義了一個(gè)name的字段, 其中存放了一個(gè)字符串切片, 為了能夠在結(jié)構(gòu)體定義中使用生命周期參數(shù), 必須在結(jié)構(gòu)體名稱后面的括號(hào)中聲明泛型生命周期參數(shù)。

接下來(lái)需要在main函數(shù)中創(chuàng)建一個(gè)結(jié)構(gòu)體實(shí)例, 將一個(gè)字符串切片內(nèi)容傳給結(jié)構(gòu)體參數(shù), 代碼如下:

fn main() {
    let sayinfo = String::from("今天天氣不錯(cuò)#挺風(fēng)和日麗的...");
    let headerinfo = sayinfo.split('#').next().expect("找不到分隔符'#'");
    let pi = PersonInfo {
        name: headerinfo,
    };
    println!("分割name內(nèi)容為: {}", pi.name);
}

在上面的代碼中, 對(duì)變量sayinfo中的內(nèi)容作了字符串分割, 如果找到符號(hào)#,則取前面的內(nèi)容,然后將該部分內(nèi)容存到結(jié)構(gòu)體字段中。

編譯結(jié)果如下:

因?yàn)樽兞縮ayinfo在結(jié)構(gòu)體PersonInfo之前創(chuàng)建, 且結(jié)構(gòu)體離開作用域之后,變量sayinfo仍然不會(huì)離開作用域, 因此PersonInfo實(shí)例中的引用一直都是有效的, 并不會(huì)出問題。

7.靜態(tài)生命周期

靜態(tài)生命周期和靜態(tài)變量一樣, 都有一個(gè)關(guān)鍵字: static, 例子代碼如下:

let sample: &'static str = "我是一個(gè)靜態(tài)周期的例子.";

現(xiàn)在變量sample的生命周期會(huì)一直持續(xù), 在整個(gè)程序中都是有效的, 盡管靜態(tài)生命周期會(huì)避免編碼過(guò)程中的很多編譯器檢查錯(cuò)誤, 但是一旦在編碼過(guò)程中出現(xiàn)懸垂引用的錯(cuò)誤編碼時(shí), 更正確的做法應(yīng)該是想辦法解決懸垂引用的問題,而不是靠靜態(tài)生命周期避開錯(cuò)誤。

8.總結(jié)

在本篇文章中我們探索了生命周期在Rust常見場(chǎng)景中的各種應(yīng)用, 但在復(fù)雜的業(yè)務(wù)場(chǎng)景中, 可能還會(huì)遇到其它錯(cuò)誤, 這時(shí)候依靠Rust編譯器強(qiáng)大的提示功能應(yīng)該能夠準(zhǔn)確找到出現(xiàn)問題的地方, 在這個(gè)過(guò)程中解決問題, 除了加深印象, 還能起到舉一反三的作用。

責(zé)任編輯:趙寧寧 來(lái)源: 二進(jìn)制空間安全
相關(guān)推薦

2009-12-22 10:05:54

WCF編程生命周期

2012-04-28 13:23:12

Java生命周期

2010-01-26 17:00:31

Android生命周期

2015-07-08 16:28:23

weak生命周期

2022-04-19 07:20:24

軟件開發(fā)安全生命周期SSDLC應(yīng)用安全

2009-06-11 11:28:35

JSF生命周期

2010-07-14 10:48:37

Perl線程

2009-07-31 10:47:18

ASP.NET頁(yè)面生命

2011-08-10 16:50:10

iPhone生命周期

2012-12-04 10:02:03

2020-12-18 09:27:23

Rust語(yǔ)言調(diào)查報(bào)告

2009-08-03 14:37:38

ASP.NET編程模型頁(yè)面生命周期

2019-10-25 09:04:19

EFKES管理

2009-02-12 13:16:55

請(qǐng)求生命周期MVCASP.NET

2009-06-18 13:32:39

Java線程生命周期

2011-06-16 09:31:21

ActivityAndroid

2012-01-16 09:00:56

線程

2013-07-29 05:11:38

iOS開發(fā)iOS開發(fā)學(xué)習(xí)類的'生命周期'

2019-10-16 10:50:13

Linux內(nèi)核測(cè)試

2009-06-17 15:06:50

Hibernate實(shí)體
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久伊人一区| 97热精品视频官网| 国产5g成人5g天天爽| 中文字幕免费高清电视剧网站在线观看| 国产精品一区二区久久精品爱涩 | caoporen国产精品| 国产精品老女人| 不卡中文一二三区| 欧美大胆人体bbbb| 日韩欧美在线播放视频| 色视频在线免费观看| 丁香婷婷综合色啪| 国产精品欧美激情| 久久免费视频99| 视频一区欧美| 日韩手机在线导航| 777米奇影视第四色| 精品欧美色视频网站在线观看| 成人综合激情网| 国产精品免费福利| 福利一区二区三区四区| 青青草成人影院| 亚洲精品在线观看视频| 三级视频中文字幕| 国产污视频在线播放| 一区在线播放视频| 精品国产乱码久久久久久久软件| 亚洲天堂视频网| 一区二区毛片| 久久成人免费视频| 高清国产在线观看| 天堂在线精品| 精品国产一区久久| 午夜影院免费观看视频| 欧美色网在线| 疯狂做受xxxx高潮欧美日本| 日本xxx免费| 9色在线观看| 国产性色一区二区| 精品久久久久久乱码天堂| 国产剧情久久久| 美腿丝袜亚洲色图| 日本精品一区二区三区在线| 久久精品亚洲无码| 亚洲国产成人精品女人| 中文字幕亚洲专区| 精品人妻中文无码av在线| 欧美五码在线| 亚洲国产欧美一区二区三区久久| 日本特黄在线观看| 亚洲电影二区| 欧美日韩亚洲综合一区| 国产高潮免费视频| 91tv亚洲精品香蕉国产一区| 日韩欧美在线观看| 国产91在线免费| av伦理在线| 午夜电影久久久| 国内精品视频一区二区三区| 青春草视频在线| 一区二区三区欧美在线观看| av动漫在线免费观看| www国产在线观看| 亚洲卡通欧美制服中文| 国产盗摄视频在线观看| av电影免费在线观看| 亚洲欧美国产毛片在线| 黄色影视在线观看| 日本高清在线观看视频| 一级做a爱片久久| 日韩欧美一级在线| 成全电影大全在线观看| 性感美女极品91精品| 狠狠97人人婷婷五月| 午夜激情电影在线播放| 色妞www精品视频| jizz欧美激情18| 免费视频成人| 欧美一区二区女人| 91精品又粗又猛又爽| 卡一精品卡二卡三网站乱码 | 国产精品久久久久91| 中文字幕av在线免费观看| 九九**精品视频免费播放| 91精品天堂| 色呦呦中文字幕| 久久精品亚洲一区二区三区浴池| 午夜欧美性电影| a级影片在线| 午夜激情综合网| wwwwxxxx日韩| 日韩精品成人在线观看| 日韩经典一区二区三区| 免费福利视频网站| 欧美二区不卡| 欧美亚洲伦理www| 中文字幕乱码一区二区| 国产在线精品免费| 久久综合入口| 免费不卡视频| 精品国产乱码久久久久久天美| 久久久久久久片| 婷婷视频一区二区三区| 亚洲欧美视频在线| 男人的天堂久久久| 亚洲欧美日韩一区在线观看| 成人黄色片网站| 天堂成人在线| 亚洲欧美二区三区| 不卡影院一区二区| 视频精品二区| 少妇久久久久久| 1级黄色大片儿| 韩国欧美国产1区| 久久久久高清| 日本不卡影院| 欧美视频第二页| 精品人妻一区二区免费视频| 天堂美国久久| 国产91色在线| 欧美 日韩 国产 成人 在线| 国产精品视频一二三| 人妻夜夜添夜夜无码av| 国产chinesehd精品露脸| 91麻豆精品国产综合久久久| 亚洲裸体xxxx| 国产精品99无码一区二区| 美女视频黄a大片欧美| 欧美日本韩国一区二区三区| 123区在线| 欧美tk丨vk视频| 国产精品精品软件男同| 日韩二区在线观看| 久久久福利视频| a√中文在线观看| 日韩一区二区三区视频在线观看| 国产精品av久久久久久无| 夜夜爽av福利精品导航| 99久久99| 美女尤物在线视频| 日韩一区二区在线观看视频| 成年人一级黄色片| 久久99精品国产| 亚洲最大色综合成人av| 亚洲精品粉嫩美女一区| 亚洲人午夜色婷婷| 国语对白永久免费| 91亚洲资源网| 国产特级黄色大片| 欧美成人基地| 26uuu国产精品视频| 污视频网站免费观看| 天天射综合影视| 中文字幕人妻一区二区三区| 亚洲人www| 韩国精品一区二区三区六区色诱| yellow字幕网在线| 亚洲精品美女在线观看| 可以免费看的av毛片| 白白色 亚洲乱淫| www.中文字幕在线| 亚洲美女久久| 国产精品白丝jk喷水视频一区| 日本韩国精品一区二区| 色偷偷久久人人79超碰人人澡| 成年人免费观看视频网站| 日韩黄色一级片| 亚洲一区二区三区色| japansex久久高清精品| 欧美麻豆久久久久久中文| 欧美一级片免费| 欧美日韩中文字幕在线| 免费观看a级片| 久久国产精品第一页| 亚洲国产精品影视| 99a精品视频在线观看| 久久免费视频在线| 国产三级在线免费观看| 欧美日韩一本到| 久久久久久久久精| 久久只精品国产| 99sesese| 亚洲大胆在线| 日韩欧美亚洲日产国产| 国产精品一区二区精品| 高清欧美电影在线| 国产精品免费播放| 日韩午夜在线观看| 日韩精品久久久久久免费| 国产精品的网站| 影音先锋黄色资源| 日本伊人午夜精品| 91免费国产精品| 九九热线有精品视频99| 成人写真福利网| 天堂а√在线最新版中文在线| 色综合亚洲精品激情狠狠| 蜜桃在线一区二区| 欧美午夜片在线看| 久久久精品一区二区涩爱| 久久久影院官网| 亚洲三级在线视频| 天堂一区二区在线| 激情五月婷婷六月| 日韩毛片视频| 久久精品五月婷婷| 国产麻豆一区二区三区| 日本欧美黄网站| 青青草原国产在线| 日韩小视频在线| 欧美在线一卡| 精品国产免费一区二区三区香蕉| 性色av一区二区三区四区| 亚洲午夜激情av| 亚洲一二三四五六区| 久久五月婷婷丁香社区| 91黄视频在线| 超碰影院在线观看| 欧美成人一品| 在线免费观看成人网| 牛牛影视一区二区三区免费看| 91色视频在线导航| 99久久er| 日韩免费不卡av| brazzers在线观看| 蜜臀久久99精品久久久无需会员 | 国产精品小仙女| 日韩精品你懂的| 男女av一区三区二区色多| 东北少妇不带套对白| 欧美在线国产| japanese在线视频| 成人网18免费网站| 日本视频一区二区在线观看| 加勒比色综合久久久久久久久 | 欧美精品国产白浆久久久久| 成人免费直播live| 欧美美女被草| 国产精品网站入口| 全球最大av网站久久| 奇米一区二区三区四区久久| 欧美日韩在线观看首页| 孩xxxx性bbbb欧美| 久久香蕉一区| 欧美多人爱爱视频网站| 中文字幕在线播放网址| 久久视频在线免费观看| 日本福利在线| xxxx性欧美| 欧美成人精品一区二区男人看| 一区二区三区在线播放欧美| 毛片网站在线观看| 亚洲欧美国产精品va在线观看| 天堂影院在线| 亚洲欧洲视频在线| 国产在线一二三区| 亚洲品质视频自拍网| 可以在线观看的av| 中文国产成人精品| 欧美a免费在线| 九九久久久久久久久激情| 天天色天天射天天综合网| 欧美福利视频在线| 日韩激情电影| 国产精品白嫩美女在线观看| 国产欧美自拍| 97se国产在线视频| 国产乱人伦丫前精品视频| 精品欧美一区二区在线观看视频| 欧美人妖视频| 色阁综合av| 五月开心六月丁香综合色啪| 成年丰满熟妇午夜免费视频| 亚洲欧洲日本mm| 91av在线免费播放| 久久se精品一区精品二区| 男人操女人下面视频| av在线这里只有精品| 日韩精品无码一区二区三区久久久| 国产欧美日韩在线视频| 中文字幕观看av| 亚洲一区自拍偷拍| 国产精品suv一区| 在线成人av网站| 三级视频在线看| 伊是香蕉大人久久| 最近中文字幕免费mv2018在线| 97精品视频在线播放| av一区在线播放| http;//www.99re视频| 亚洲黄页网站| 黄色网zhan| 香蕉国产精品偷在线观看不卡| 911福利视频| www国产成人免费观看视频 深夜成人网| 少妇一级黄色片| 亚洲香蕉伊在人在线观| 亚洲中文无码av在线| 欧美不卡123| jizzjizz在线观看| 高清视频欧美一级| 欧美a视频在线| 久久久免费看| 欧美日韩福利| 另类小说色综合| 97se亚洲国产综合自在线观| 国产suv精品一区二区68| 欧美日韩一区二区三区在线免费观看 | 欧美精品久久久久久久久久丰满| 久久久成人精品| 自拍一区在线观看| 99国产精品久久久久老师| 欧美日韩国产免费观看视频| 9色porny| 国产一区二区三区免费观看| 精品人伦一区二区| 亚洲成a人v欧美综合天堂下载| 亚洲天堂久久久久| 国产性猛交xxxx免费看久久| h片精品在线观看| 亚洲xxxxx| 欧美国产小视频| 哪个网站能看毛片| av在线这里只有精品| 免费视频一二三区| 欧美一区二区在线看| 2019中文字幕在线视频| 日韩av电影在线播放| 久久午夜影院| av网站手机在线观看| 国产高清不卡二三区| 黄色录像一级片| 欧美日韩国产综合视频在线观看| 每日更新在线观看av| 庆余年2免费日韩剧观看大牛| 加勒比视频一区| 秋霞无码一区二区| 成人黄色在线视频| 国产在线观看你懂的| 欧美大片免费久久精品三p| 国产在线观看91| 成人免费午夜电影| 亚洲一区二区| 毛毛毛毛毛毛毛片123| 18成人在线观看| 国产人妻精品一区二区三| 色视频www在线播放国产成人 | eeuss一区二区三区| 欧美精品成人| 中文在线观看免费视频| 亚洲成av人片在www色猫咪| 全部免费毛片在线播放一个| 久久久女女女女999久久| 精品中国亚洲| 国产精品视频一区二区三区四区五区| av在线综合网| 国产成人无码一区二区在线播放| 亚洲人成在线观看| 国产69精品久久| 中文字幕一区二区三区乱码| 国产毛片一区二区| 欧美日韩精品在线观看视频| 日韩欧美激情四射| 136福利第一导航国产在线| 蜜桃av噜噜一区二区三区| 久久精品成人| 妖精视频在线观看免费| 欧美一区二区在线视频| 91资源在线观看| 欧美日韩电影一区二区三区| 蜜臀久久99精品久久久久宅男| 日本激情视频一区二区三区| 日韩午夜激情免费电影| 国产黄大片在线观看| 欧美在线视频二区| 精品一区精品二区高清| 青娱乐国产在线视频| 亚洲精品美女久久久久| 国产精品高潮久久| 大陆极品少妇内射aaaaaa| jizz一区二区| 岳乳丰满一区二区三区| 欧美高跟鞋交xxxxxhd| 欧美人与牛zoz0性行为| 亚洲国产成人va在线观看麻豆| 亚洲国产人成综合网站| 蜜桃视频在线入口www| 亚洲自拍偷拍色片视频| 亚洲专区在线| 日韩激情小视频| 国产手机视频精品| 国产视频一区二| 欧美污视频网站| 亚洲夂夂婷婷色拍ww47| 国产精品久久久久一区二区国产| 91在线高清免费观看| 亚洲综合激情| 欧美做爰爽爽爽爽爽爽| 亚洲欧美精品在线| 一区二区三区高清在线观看|