精品欧美一区二区三区在线观看 _久久久久国色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)

国产熟女精品视频| 丰满岳乱妇一区二区| 国产剧情在线| 成人免费电影视频| 日本亚洲欧美三级| 精品国产国产综合精品| 久久资源综合| 这里只有精品99re| 日本丰满少妇xxxx| 无遮挡动作视频在线观看免费入口| 国产成人av电影在线| 日韩免费视频在线观看| 国产在线视频二区| 久久精品国产99久久| 精品va天堂亚洲国产| 蜜臀av免费观看| 888av在线视频| 中文字幕视频一区二区三区久| 国产一区自拍视频| 国产孕妇孕交大片孕| 亚洲永久免费精品| 欧美激情一区二区三级高清视频| 先锋影音av在线| 懂色av一区二区| 在线综合视频播放| 日韩 欧美 高清| av丝袜在线| 亚洲免费观看高清完整版在线观看| 欧美最大成人综合网| 东京干手机福利视频| 久久福利视频一区二区| 日本精品一区二区三区在线播放视频 | 久久99精品久久久久久秒播放器 | 欧美日韩 一区二区三区| 欧美天天在线| 久久精品这里热有精品| 国内精品卡一卡二卡三| 婷婷国产精品| 亚洲第一男人天堂| 日韩精品国产一区| 麻豆国产一区二区三区四区| 欧美日韩国产免费一区二区| 黄色一级大片在线观看| 国产不卡人人| 精品福利免费观看| 成年人看的毛片| 免费影视亚洲| 亚洲电影一级黄| 日韩黄色片在线| 亚洲丝袜一区| 亚洲一区中文日韩| 欧美一区二区激情| mm视频在线视频| 精品久久久久久久久国产字幕| 九色自拍视频在线观看| 大桥未久在线播放| 亚洲成人av在线电影| 日日摸日日碰夜夜爽无码| av电影免费在线看| 精品久久久久久国产91| av免费在线播放网站| 亚洲承认视频| 欧美色图12p| 看看黄色一级片| 久久伊人久久| 日韩精品一区二区在线观看| 欧美丰满熟妇bbb久久久| 精品三级av在线导航| 日韩精品中文字幕在线观看 | 日本成人中文| 亚洲毛片在线观看| 受虐m奴xxx在线观看| 日韩夫妻性生活xx| 久久精品国产久精国产思思| 欧美日韩精品在线观看视频| 在线精品在线| 国产精品91在线观看| ,亚洲人成毛片在线播放| 国产福利一区二区三区| 国产伦一区二区三区色一情| 日av在线播放| 国产精品对白交换视频| 国内少妇毛片视频| 玛雅亚洲电影| 日韩西西人体444www| 韩国无码一区二区三区精品| 色综合色综合| 欧美精品18videos性欧美| 欧美一级淫片免费视频黄| 麻豆国产91在线播放| 999国内精品视频在线| 神马久久久久| 国产欧美精品一区| 黄色一级大片免费| 欧美色网在线| 日韩欧美国产成人一区二区| 亚洲国产无码精品| 在线看片不卡| 国产福利视频一区| 亚洲第一页在线观看| 久久久精品蜜桃| 免费日韩在线观看| 欧美一级二级视频| 亚洲电影免费观看| 黄色录像一级片| 久久精品官网| 成人免费视频观看视频| 国产小视频免费在线网址| 亚洲黄网站在线观看| 少妇黄色一级片| 亚洲国产中文在线| 尤物yw午夜国产精品视频明星| 久久一二三四区| 久久97超碰色| 日本欧美精品久久久| sis001亚洲原创区| 欧美性感一类影片在线播放| 99精品一区二区三区无码吞精 | 国内欧美日韩| 粉嫩欧美一区二区三区高清影视| 免费中文日韩| 青春草在线视频| 日韩欧美极品在线观看| 丰满人妻一区二区三区大胸 | 日韩av综合在线| 国产综合久久久久久久久久久久| 久久亚洲高清| 九色porny自拍视频在线播放| 91麻豆精品国产91久久久久久久久| www.久久av| 国产欧美日韩亚洲一区二区三区| 成人91视频| 在线中文字幕第一页| 欧美久久一二区| 四虎国产成人精品免费一女五男| 免费在线亚洲| 国产综合动作在线观看| 国产三线在线| 亚洲аv电影天堂网| 国产一级片网址| 国产成人精品亚洲777人妖| 伊人婷婷久久| 99tv成人影院| 欧美猛交免费看| 国产超碰人人模人人爽人人添| 国产精品理伦片| 国产美女18xxxx免费视频| 欧美亚洲精品在线| 国产精品网站视频| 永久免费av在线| 欧美夫妻性生活| 亚洲天堂一级片| 狠狠色综合播放一区二区| 亚洲综合激情五月| 日本成人精品| 国模精品一区二区三区色天香| 亚洲精品97久久中文字幕无码| 一区二区三区日韩精品视频| 国产欧美视频一区| 亚洲久久成人| 欧洲av一区| 日韩国产一二三区| 欧美精品中文字幕一区| 丰满人妻一区二区三区免费视频 | 国产免费不卡av| 久久av最新网址| 亚洲美女www午夜| 香蕉影院在线观看| 欧美日韩伦理片| 国产综合久久久久影院| 91免费版看片| 久久大胆人体视频| 国产成人高清激情视频在线观看| 岛国视频免费在线观看| 欧美欧美欧美欧美首页| 久久免费少妇高潮99精品| 成人高清视频在线| 欧美成人免费高清视频| 婷婷色综合网| 国内成+人亚洲| 99re久久| 久久青草福利网站| 国产女人在线视频| 欧美一二三区精品| 中日韩黄色大片| 亚洲国产成人在线| 欧美性猛交乱大交| 国产日韩综合| 亚洲一区二区三区涩| 99香蕉久久| 国产高清在线不卡| 国精一区二区三区| 最新69国产成人精品视频免费| 国产aⅴ爽av久久久久成人| 亚洲成av人片| 九九这里只有精品视频| 99久久精品国产网站| 亚洲综合av在线播放| 亚洲欧洲一区| 伊人情人网综合| 五月国产精品| 97超碰人人看人人| 日韩高清成人| 91精品国产高清自在线| 成人免费网站在线观看视频| 日韩精品视频免费专区在线播放 | 国精产品久拍自产在线网站| 不卡的电视剧免费网站有什么| 天天色综合天天色| 国产欧美综合一区二区三区| 在线日韩av永久免费观看| 校园春色另类视频| 高清视频一区二区三区| 视频91a欧美| 人九九综合九九宗合| 超级碰碰不卡在线视频| 久久资源免费视频| 成人在线高清视频| 日韩精品在线影院| 亚洲精品字幕在线观看| 777亚洲妇女| 波多野结衣绝顶大高潮| 精品久久久久人成| 久久99久久98精品免观看软件| 国产精品对白交换视频| x88av在线| 久久久电影一区二区三区| av av在线| 国产v日产∨综合v精品视频| 中文字幕亚洲乱码| 蜜桃视频一区二区三区 | 国产一区欧美一区| www.日本一区| 日本麻豆一区二区三区视频| 国产91在线免费| 亚洲精一区二区三区| 国产美女主播在线播放| 欧美午夜a级限制福利片| 伊人再见免费在线观看高清版| 99久精品视频在线观看视频| 午夜久久资源| 欧美色图在线播放| 日本视频一区在线观看| 精品一区二区三区中文字幕老牛 | 1024精品久久久久久久久| 一本一道久久a久久精品综合| 禁断一区二区三区在线| 日韩精品不卡| 日韩欧美三级| 影音先锋欧美资源| 亚洲国产精品综合久久久| 老汉色影院首页| 91精品啪在线观看国产18| 黄黄视频在线观看| 一区二区在线影院| 亚洲五码在线观看视频| 亚洲一级网站| 乱妇乱女熟妇熟女网站| 久久久久久色| 中文字幕中文在线| 国产成人免费在线观看| 亚洲色图欧美另类| 久久综合九色欧美综合狠狠| 亚洲人成人无码网www国产| 国产欧美日韩久久| 男人的午夜天堂| 亚洲国产婷婷综合在线精品| 国产成人无码精品久在线观看| 色综合天天性综合| 在线免费观看高清视频| 日韩午夜激情av| 天堂在线资源8| 伊人久久男人天堂| 成人国产免费电影| 国内精品视频一区| **欧美日韩在线观看| 国产欧美一区二区三区久久 | 日韩成人免费电影| 天天综合天天添夜夜添狠狠添| 国产成人精品www牛牛影视| 人妻精品久久久久中文字幕| 国产精品网站一区| 九九九免费视频| 色妹子一区二区| 国产欧美一级片| 日韩精品视频免费在线观看| 日本精品在线| 91av在线精品| 91精品在线免费视频| 国产一区福利视频| 久久人人88| www黄色日本| 韩国v欧美v亚洲v日本v| 亚洲欧美视频在线播放| 亚洲欧美综合色| 亚洲伊人成人网| 日韩一区二区免费电影| 国产一级网站视频在线| 久久免费在线观看| 色8久久久久| 久久大片网站| 午夜精品免费| 日本肉体xxxx裸体xxx免费| 成人激情小说网站| 日韩国产第一页| 色婷婷av久久久久久久| 丰满肉肉bbwwbbww| 日韩最新在线视频| 三上悠亚亚洲一区| 国产精品精品软件视频| 天天操综合网| 天堂社区在线视频| 成人avav在线| 极品久久久久久| 欧美三级资源在线| 免费黄色在线视频网站| 国外色69视频在线观看| 日韩08精品| 永久久久久久| 美女一区二区久久| 亚洲AV无码国产成人久久| 亚洲国产人成综合网站| www.精品久久| 不卡av电影在线观看| 免费视频成人| 亚洲一区二三| 麻豆精品一区二区av白丝在线| 三上悠亚ssⅰn939无码播放 | 香蕉久久精品| 欧美成人高潮一二区在线看| 国产成+人+日韩+欧美+亚洲| 国产天堂av在线| 日韩一区二区电影| 成人国产免费电影| 92福利视频午夜1000合集在线观看 | 国产精品探花在线| 97超级碰碰| 樱桃成人精品视频在线播放| 韩国三级在线播放| 一区二区三区在线免费观看| 99久久精品国产色欲| 久热精品视频在线免费观看 | 精品国产乱码久久久久久郑州公司 | 色综合蜜月久久综合网| 午夜免费看毛片| 亚洲视频图片小说| 精品人妻久久久久一区二区三区| 精品中文字幕乱| ccyy激情综合| 国自产拍偷拍精品啪啪一区二区| www.日本不卡| 日本熟女毛茸茸| 中文字幕欧美日韩| 99精品视频在线免费播放| 亚洲精品国产suv一区88| 成av人片一区二区| 在线能看的av| 在线观看91久久久久久| 巨大黑人极品videos精品| 中国一区二区三区| 国产精品系列在线观看| 日韩精品成人一区| 亚洲精品之草原avav久久| 欧美色网在线| 路边理发店露脸熟妇泻火| 成人晚上爱看视频| 国产一级免费视频| 色yeye香蕉凹凸一区二区av| 精品一区二区三区在线观看视频| 青青青在线观看视频| 99久久国产综合精品色伊| 久久久久在线视频| 色老头一区二区三区| 亚洲日本视频在线| 3d动漫一区二区三区| 国产亚洲欧美色| 国产口爆吞精一区二区| 国模极品一区二区三区| 久久99免费视频| 久久精品视频在线观看免费| 性做久久久久久久久| av资源种子在线观看| 99国产在线| 久久亚洲美女| 久久精品这里只有精品| 亚洲免费电影一区| 国产aa精品| 浮妇高潮喷白浆视频| 国产精品日日摸夜夜摸av| 成人免费视频国产| 国产精品久久久久av| 韩国欧美一区| 亚洲图片第一页| 亚洲国产日韩一区| 国产精品日本一区二区不卡视频 | 久久久精品国产亚洲| 欧美1区2区3区4区| 中文字幕资源在线观看| 欧美视频国产精品| 日本片在线看|