Rust 引用與借用

引用與借用

fn main() {
  let s1 = String::from("abc");
  let l = f1(&s1);
  println!("s1 = {}, len = {}", s1, l);
}

fn f1(s: &String) -> usize {
  s.len()
}

這里將s1傳給了 f1函數(shù)犁功,使用的是&s1,f1定義的形參類型是&String绍豁。這些&符號(hào)就是引用,它們?cè)试S你使用值但不獲取所有權(quán)枷踏。

&s語法 讓我們創(chuàng)建了一個(gè)指向s1的引用驳规,但是不擁有它揪胃。因?yàn)椴粨碛羞@個(gè)值,在離開作用域時(shí)也不需要drop特殊操作缰猴。

我們將獲取引用作為函數(shù)參數(shù)稱為借用产艾。正如變量默認(rèn)是不可邊的,應(yīng)用也是一樣滑绒。

fn f1(s: &String) -> usize {
  s.push_str("hello"); // 這里將發(fā)生錯(cuò)誤胰舆,嘗試修改不可變的借用的值
  s.len();
}

與運(yùn)算符 & 引用相反的操作是*解引用

可變引用

fn main() {
  let mut s = String:from("hello");
  change(&mut s);
}

fn change(s: &mut String) {
  s.push_str(", world");
}

首選將s改為 mut的,然后必須創(chuàng)建一個(gè)可變引用&mut s和接受一個(gè)可變引用s: &mut String蹬挤。

不過可邊引用有很大的限制缚窿,在特定作用域的特定數(shù)據(jù)有且只有一個(gè)可變引用

let mut s1 = String::from("hello");
let s2 = &mut s1;
let s3 = &mut s1;
println!("{}, {}", s2, s3);

這里將報(bào)錯(cuò)焰扳,這個(gè)限制的好處是Rust在編譯時(shí)就避免數(shù)據(jù)競(jìng)爭(zhēng)倦零。數(shù)據(jù)競(jìng)爭(zhēng)類似于競(jìng)態(tài)條件。它由這三個(gè)條件造成:

  • 兩個(gè)或更多指針同時(shí)訪問同一數(shù)據(jù)
  • 至少有一個(gè)指針被用來寫數(shù)據(jù)
  • 沒有同步數(shù)據(jù)訪問的機(jī)制

數(shù)據(jù)競(jìng)爭(zhēng)會(huì)導(dǎo)致未定義行為吨悍,難以在運(yùn)行時(shí)追蹤扫茅,且難以診斷和恢復(fù)。Rust避免了這種情況發(fā)生育瓜,因?yàn)樗踔敛粫?huì)編譯存在數(shù)據(jù)競(jìng)爭(zhēng)的代碼葫隙。

let mut s = String::from("hello");
{
  let r1 = &mut s;
} // r1 離開了作用域,可以創(chuàng)建一個(gè)新的引用
let r2 = &mut s;

類似的規(guī)則也存在于可變引用和不可變引用中躏仇。

let mut s = String::from("hello");

let r1 = &s; // 可以
let r2 = &s; // 可以
let r3 = &mut s; // 不行

Rust不允許不可變引用和可變引用同時(shí)指向一個(gè)值恋脚,不可變引用不希望再讀取值時(shí)被修改腺办。多個(gè)不可變引用是可以的。

懸垂引用

在具有指針的語言中糟描,很容易變量指向一個(gè)已釋放的內(nèi)存怀喉,而錯(cuò)誤的產(chǎn)生一個(gè) 懸垂指針。嘗試創(chuàng)建一個(gè)懸垂指針:

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

fn f1() -> &String {
  let s = String::from("hello"); // 創(chuàng)建字符串船响,分配內(nèi)存
  &s // 返回字符串的引用
} // s 離開作用域躬拢,釋放內(nèi)存

當(dāng)s離開作用域時(shí),s將被釋放见间。嘗試返回s的引用聊闯,Rust不允許這么做,這里將發(fā)生錯(cuò)誤米诉。

引用的規(guī)則

總結(jié):

  • 在任意給定時(shí)間馅袁,要么只能有一個(gè)可變應(yīng)用,要么只能是多個(gè)不可變引用
  • 引用必須總是有效
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荒辕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子犹褒,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冀宴,死亡現(xiàn)場(chǎng)離奇詭異祟印,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宙枷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門掉房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慰丛,你說我怎么就攤上這事卓囚。” “怎么了诅病?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵哪亿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我贤笆,道長(zhǎng)蝇棉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任芥永,我火速辦了婚禮篡殷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埋涧。我一直安慰自己板辽,他們只是感情好奇瘦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戳气,像睡著了一般链患。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓶您,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天麻捻,我揣著相機(jī)與錄音,去河邊找鬼呀袱。 笑死贸毕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夜赵。 我是一名探鬼主播明棍,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寇僧!你這毒婦竟也來了摊腋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤嘁傀,失蹤者是張志新(化名)和其女友劉穎兴蒸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體细办,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡橙凳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笑撞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岛啸。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茴肥,靈堂內(nèi)的尸體忽然破棺而出坚踩,到底是詐尸還是另有隱情,我是刑警寧澤瓤狐,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布堕虹,位于F島的核電站,受9級(jí)特大地震影響芬首,放射性物質(zhì)發(fā)生泄漏赴捞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一郁稍、第九天 我趴在偏房一處隱蔽的房頂上張望赦政。 院中可真熱鬧,春花似錦、人聲如沸恢着。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掰派。三九已至从诲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間靡羡,已是汗流浹背系洛。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留略步,地道東北人描扯。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像趟薄,于是被迫代替她去往敵國(guó)和親绽诚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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