Rust基礎(chǔ)學(xué)習(xí)-07-通俗解釋引用與借用

今天我們來(lái)學(xué)習(xí)一下Rust中的引用與借用侠讯。我在看官方教程講解引用與借用的時(shí)候挖藏,很困惑,分不清引用與借用继低。在第二遍理解的時(shí)候熬苍,大概能夠理清了。

先來(lái)解釋一下 引用袁翁,Rust官方文檔中的解釋是 允許使用值但不獲取其所有權(quán)柴底。與其他語(yǔ)言基本一樣,可以理解為就是一個(gè)數(shù)據(jù)指針粱胜。

再來(lái)說(shuō)一下 借用柄驻,官方文檔中解釋借用是指 將獲取引用作為函數(shù)參數(shù)稱(chēng)為 借用(borrowing)。我的理解是焙压,借用不是一個(gè)具體的東西鸿脓,而是一種行為,對(duì)于Rust來(lái)說(shuō)涯曲,當(dāng)我們定義一下函數(shù)野哭,而函數(shù)的形參是一個(gè)引用,或者說(shuō)是一個(gè)指針時(shí)幻件,這種行為拨黔,就叫做借用〈铝ぃ可能不太精確地解釋?zhuān)梢岳斫鉃槔橛?dāng)我們調(diào)用這個(gè)函數(shù)時(shí)贺待,這個(gè)函數(shù)借用了外面某個(gè)數(shù)據(jù)的訪問(wèn)權(quán)限,但是并不擁有外面數(shù)據(jù)的所有權(quán)零截。就像生活中你借了某人的一個(gè)網(wǎng)站賬號(hào)麸塞,這時(shí),你可以訪問(wèn)網(wǎng)站上的內(nèi)容了涧衙,但是你沒(méi)有這個(gè)賬號(hào)的所有權(quán)哪工。

當(dāng)將引用作為參數(shù)時(shí),也分為 可變引用不可變引用

不可變引用

fn main() {
    let mut str = String::from("Hello");
    borrowing(&str);
}

fn borrowing(str: &String) {
    println!("Borrowing Str: {}", str);
}

可變引用

fn main() {
    let mut str = String::from("Hello");
    println!("Source Str: {}", str);    // 這里打印出原來(lái)的字符串
    mut_borrowing(&mut str);    // 調(diào)用后绍撞,字符串被改變
    println!("Str: {}", str); // 打印改變后的字符串
}

fn mut_borrowing(str: &mut String) {
    str.push_str(" , Rust");
}

有一條很重要的規(guī)則要記住正勒,在同一作用域中,一個(gè)數(shù)據(jù)傻铣,有且只有一個(gè) 可變 引用章贞。

下面一段代碼就是錯(cuò)的,編譯不過(guò)非洲,因?yàn)橥蛔饔糜蛳卵枷蓿粋€(gè)數(shù)據(jù)有多個(gè)可變引用

fn main() {
    let mut str = String::from("Hello");
    let r1 = &mut str;
    let r2 = &mut str;
    println!("{}, {}", r1, r2);
}

關(guān)于數(shù)據(jù)競(jìng)爭(zhēng)

Rust 這樣的限制可以避免數(shù)據(jù)競(jìng)爭(zhēng),數(shù)據(jù)競(jìng)爭(zhēng)可能由下面三個(gè)原因引起

  • 兩個(gè)或更多指針同時(shí)訪問(wèn)同一數(shù)據(jù)两踏。
  • 至少有一個(gè)指針被用來(lái)寫(xiě)入數(shù)據(jù)败京。
  • 沒(méi)有同步數(shù)據(jù)訪問(wèn)的機(jī)制。

懸垂引用(Dangling References)

在擁有指針的編程語(yǔ)言中很容易出現(xiàn)一種情況梦染,一個(gè)指針還存在赡麦,但是指針指向的內(nèi)存已經(jīng)被釋放。在Rust中帕识,這種為懸垂引用泛粹。在Rust中,Rust編譯器確保指針永遠(yuǎn)不會(huì)變?yōu)閼掖範(fàn)顟B(tài)肮疗。

看下面的代碼晶姊,編譯會(huì)出錯(cuò)

fn main() {
    let s = dangling();
}

// 這個(gè)函數(shù)返回了字符串的引用,但是當(dāng)這個(gè)函數(shù)結(jié)束時(shí)伪货,字符串內(nèi)存會(huì)被釋放们衙,&s變?yōu)閼掖範(fàn)顟B(tài),所以編譯出錯(cuò)
fn dangling() -> &String {
    let s = String::from("Hello rust");
    &s 
}

引用的規(guī)則

  • 在任意給定時(shí)間碱呼,要么 只能有一個(gè)可變引用蒙挑,要么 只能有多個(gè)不可變引用。
  • 引用必須總是有效愚臀。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脆荷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜓谋,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炭分,死亡現(xiàn)場(chǎng)離奇詭異桃焕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)捧毛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)观堂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人呀忧,你說(shuō)我怎么就攤上這事师痕。” “怎么了而账?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵胰坟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我泞辐,道長(zhǎng)笔横,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任咐吼,我火速辦了婚禮吹缔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锯茄。我一直安慰自己厢塘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布肌幽。 她就那樣靜靜地躺著晚碾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牍颈。 梳的紋絲不亂的頭發(fā)上迄薄,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音煮岁,去河邊找鬼讥蔽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛画机,可吹牛的內(nèi)容都是我干的冶伞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼步氏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼响禽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芋类,失蹤者是張志新(化名)和其女友劉穎隆嗅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體侯繁,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胖喳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贮竟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丽焊。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咕别,靈堂內(nèi)的尸體忽然破棺而出技健,到底是詐尸還是另有隱情,我是刑警寧澤惰拱,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布雌贱,位于F島的核電站,受9級(jí)特大地震影響弓颈,放射性物質(zhì)發(fā)生泄漏帽芽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一翔冀、第九天 我趴在偏房一處隱蔽的房頂上張望导街。 院中可真熱鬧,春花似錦纤子、人聲如沸搬瑰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泽论。三九已至,卻和暖如春卡乾,著一層夾襖步出監(jiān)牢的瞬間翼悴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工幔妨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹦赎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓误堡,卻偏偏與公主長(zhǎng)得像古话,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锁施,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容