国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Rust - 可變引用和懸垂引用

這篇具有很好參考價(jià)值的文章主要介紹了Rust - 可變引用和懸垂引用。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

?可變引用

在上一篇文章中,我們提到了借用的概念,將獲取引用作為函數(shù)參數(shù)稱為?借用borrowing),通常情況下,我們無法修改借來的變量,但是可以通過可變引用實(shí)現(xiàn)修改借來的變量。代碼示例如下:

fn main() {
    let mut s = String::from("hello");  // s是可變的變量
    
    change(&mut s);  // &mut 表示可變引用
}

fn change(some_string: &mut String) {  // &mut 表示可變引用
    some_string.push_str(", world");
}

要想實(shí)現(xiàn)修改借來的變量就必須將?s改為?mut。然后必須創(chuàng)建一個(gè)可變引用?&mut s和接受一個(gè)可變引用?some_string: &mut String

但是可變引用有一個(gè)很大的限制:在特定作用域中的特定數(shù)據(jù)只能有一個(gè)可變引用。比如下述代碼就不會(huì)被成功編譯。

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

編譯運(yùn)行就會(huì)拋出如下異常:

error[E0499]: cannot borrow `s` as mutable more than once at a time
 --> src/main.rs:5:14
  |
4 |     let r1 = &mut s;
  |              ------ first mutable borrow occurs here
5 |     let r2 = &mut s;
  |              ^^^^^^ second mutable borrow occurs here
6 |
7 |     println!("{}, {}", r1, r2);
  |                        -- first borrow later used here

所以這種修改借來的變量的可變引用是以一種受限制的方式允許修改,這個(gè)限制的好處是 Rust 可以在編譯時(shí)就避免數(shù)據(jù)競爭。數(shù)據(jù)競爭data race)類似于競態(tài)條件,它可由這三個(gè)行為造成:

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

數(shù)據(jù)競爭會(huì)導(dǎo)致未定義行為,難以在運(yùn)行時(shí)追蹤,并且難以診斷和修復(fù);Rust 避免了這種情況的發(fā)生。我們可以使用{}創(chuàng)建一個(gè)新的作用域,這樣就能夠允許多個(gè)可變引用了,只是不能在同一個(gè)作用域中同時(shí)擁有:

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

	{
    	let r1 = &mut s;

	} // r1 在這里離開了作用域,所以我們完全可以創(chuàng)建一個(gè)新的引用

	let r2 = &mut s;
}

另外還需要注意的是,不能在擁有不可變引用的同時(shí)擁有可變引用。不可變引用的用戶可不希望在他們的眼皮底下值就被意外的改變了!但是多個(gè)不可變引用是可以的,因?yàn)闆]有哪個(gè)只能讀取數(shù)據(jù)的人有能力影響其他人讀取到的數(shù)據(jù)。如下述代碼:

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

    let r1 = &s; // 沒問題
    let r2 = &s; // 沒問題
    let r3 = &mut s; // 在擁有不可變引用的同時(shí)擁有可變引用

    println!("{}, {}, and {}", r1, r2, r3);

} 

上面代碼示例編譯時(shí)會(huì)拋出如下異常:

error[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable
 --> src/main.rs:6:14
  |
4 |     let r1 = &s; // no problem
  |              -- immutable borrow occurs here
5 |     let r2 = &s; // no problem
6 |     let r3 = &mut s; // BIG PROBLEM
  |              ^^^^^^ mutable borrow occurs here
7 |
8 |     println!("{}, {}, and {}", r1, r2, r3);
  |                                -- immutable borrow later used here

但是如果可變引用和不可變引用他們的作用域不重疊代碼就是可以編譯的,我們可以將上面的代碼示例進(jìn)行修改就可以正常運(yùn)行了。

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

    let r1 = &s; // 沒問題
    let r2 = &s; // 沒問題
    println!("{} and {}", r1, r2);
    // 此位置之后 r1 和 r2 不再使用

    let r3 = &mut s; // 沒問題
    println!("{}", r3);

}

懸垂引用(Dangling References)

在具有指針的語言中,很容易通過釋放內(nèi)存時(shí)保留指向它的指針而錯(cuò)誤地生成一個(gè)?懸垂指針dangling pointer),所謂懸垂指針是其指向的內(nèi)存可能已經(jīng)被分配給其它持有者。相比之下,在 Rust 中編譯器確保引用永遠(yuǎn)也不會(huì)變成懸垂?fàn)顟B(tài):當(dāng)你擁有一些數(shù)據(jù)的引用,編譯器確保數(shù)據(jù)不會(huì)在其引用之前離開作用域。

當(dāng)我們不小心創(chuàng)建了懸垂引用,Rust在編譯的時(shí)候就會(huì)拋出異常:

fn main() {
    let reference_to_nothing = dangle();
}

fn dangle() -> &String {  // dangle 返回一個(gè)字符串的引用
    let s = String::from("hello");  // s 是一個(gè)新字符串

    &s  // 返回字符串 s 的引用
}// 這里 s 離開作用域并被丟棄。其內(nèi)存被釋放。

因?yàn)?s是在?dangle函數(shù)內(nèi)創(chuàng)建的,當(dāng)?dangle的代碼執(zhí)行完畢后,s將被釋放。不過我們嘗試返回它的引用。這意味著這個(gè)引用會(huì)指向一個(gè)無效的?String,所以在編譯時(shí)Rust就會(huì)拋出異常,解決方式就是直接返回String。

fn no_dangle() -> String {
    let s = String::from("hello");

    s
}  // 所有權(quán)被移動(dòng)出去,內(nèi)存沒有被釋放

最后感謝每一個(gè)認(rèn)真閱讀我文章的人,禮尚往來總是要有的,這些資料,對于【軟件測試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

Rust - 可變引用和懸垂引用,軟件測試,rust,開發(fā)語言,后端,軟件測試,功能測試,自動(dòng)化測試,程序人生

這些資料,對于【軟件測試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個(gè)倉庫也陪伴上萬個(gè)測試工程師們走過最艱難的路程,希望也能幫助到你!

Rust - 可變引用和懸垂引用,軟件測試,rust,開發(fā)語言,后端,軟件測試,功能測試,自動(dòng)化測試,程序人生文章來源地址http://www.zghlxwxcb.cn/news/detail-814305.html

到了這里,關(guān)于Rust - 可變引用和懸垂引用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Rust 基礎(chǔ)篇】Rust 解引用多態(tài)

    在 Rust 中,解引用多態(tài)(Deref Coercion)是一種特性,它允許自動(dòng)進(jìn)行類型轉(zhuǎn)換,將實(shí)現(xiàn)了 Deref trait 的類型轉(zhuǎn)換為目標(biāo)類型的引用。通過解引用多態(tài),我們可以更方便地使用不同類型的智能指針和引用。 本篇博客將詳細(xì)介紹 Rust 中解引用多態(tài)的使用方法和相關(guān)概念,以及它在代

    2024年02月16日
    瀏覽(15)
  • 【Rust 基礎(chǔ)篇】Rust 引用循環(huán):解析和避免

    在 Rust 中,引用循環(huán)是指兩個(gè)或多個(gè)對象之間相互引用,形成一個(gè)循環(huán)鏈。這種情況下,對象之間的引用計(jì)數(shù)永遠(yuǎn)不會(huì)變?yōu)榱悖瑢?dǎo)致內(nèi)存泄漏和資源泄漏。本篇博客將詳細(xì)介紹 Rust 引用循環(huán)的概念、問題和解決方案,并通過代碼示例演示如何避免引用循環(huán)。 引用循環(huán)在 Rust

    2024年02月17日
    瀏覽(20)
  • 【軟件測試】淺了解什么是軟件測試及開發(fā)測試模型

    【軟件測試】淺了解什么是軟件測試及開發(fā)測試模型

    目錄 1.什么是軟件測試? 2.什么是需求? 3.什么是測試用例 4.什么是軟件錯(cuò)誤(bug)? 5.開發(fā)模型和測試模型 5.1軟件的生命周期 5.2瀑布模型 5.3螺旋模型 5.4軟件測試V模型 5.5軟件測試w模型 6.軟件測試的生命周期 7.bug的生命周期 最常見的理解是:軟件測試就是找 BUG ,發(fā)現(xiàn)缺陷

    2023年04月19日
    瀏覽(37)
  • 【軟件測試】軟件測試的基本概念和開發(fā)模型

    【軟件測試】軟件測試的基本概念和開發(fā)模型

    在進(jìn)行軟件測試的學(xué)習(xí)之前,我們要了解軟件測試一些基本概念. 這些基本概念將幫助我們更加明確工作的目標(biāo)以及軟件測試到底要做什么. 軟件測試的基本概念有3個(gè),分別是 需求,測試用例和BUG. 這里的需求還可以分為 用戶需求和軟件需求 ,用戶需求: 簡單理解為甲方提出的需求

    2023年04月15日
    瀏覽(24)
  • 軟件測試/測試開發(fā)丨ChatGPT在軟件測試領(lǐng)域的應(yīng)用

    軟件測試/測試開發(fā)丨ChatGPT在軟件測試領(lǐng)域的應(yīng)用

    隨著互聯(lián)網(wǎng)技術(shù)的迅速發(fā)展,軟件已經(jīng)成為現(xiàn)代社會(huì)中不可或缺的一部分。而軟件測試作為保障軟件質(zhì)量的關(guān)鍵環(huán)節(jié),也越來越受到人們的關(guān)注。在這個(gè)領(lǐng)域,ChatGPT作為一種新型的人工智能技術(shù),正逐漸應(yīng)用于軟件測試領(lǐng)域,為軟件測試帶來了諸多創(chuàng)新和改進(jìn)。 在軟件測試

    2024年02月14日
    瀏覽(33)
  • Soft:軟件開發(fā)的簡介(敏捷開發(fā)等6大軟件開發(fā)模式)、軟件測試的簡介(單元測試/集成測試/系統(tǒng)測試/驗(yàn)收測試/回歸測試、黑白灰功能測試、DEV等四套環(huán)境)、運(yùn)維的簡介之詳細(xì)攻略

    Soft:軟件開發(fā)的簡介(敏捷開發(fā)等6大軟件開發(fā)模式)、軟件測試的簡介(單元測試/集成測試/系統(tǒng)測試/驗(yàn)收測試/回歸測試、黑白灰功能測試、DEV等四套環(huán)境)、運(yùn)維的簡介之詳細(xì)攻略 目錄 1、軟件開發(fā)(敏捷開發(fā)等6大軟件開發(fā)模式) Computer:敏捷開發(fā)Scrum方法的簡介、發(fā)展歷程、開

    2024年02月04日
    瀏覽(98)
  • 測試軟件開發(fā)---軟件缺陷章

    軟件缺陷 軟件出現(xiàn)缺陷一般是因?yàn)殚_發(fā)的流程規(guī)劃不準(zhǔn)確,需求不明確,或需求變更/在開發(fā)者開發(fā)的時(shí)候無法清晰的理解需求出現(xiàn)不同程度的偏差/客戶方頻繁的更改、更新需求也會(huì)影響到軟件的質(zhì)量 軟件結(jié)構(gòu)復(fù)雜、編碼誤差/錯(cuò)誤、項(xiàng)目期限過短、項(xiàng)目中插入新的技術(shù) 處理

    2024年02月02日
    瀏覽(44)
  • rust 引用怎么用

    rust 引用怎么用

    文章會(huì)通過三個(gè)例子來了解 rust 所有權(quán)的機(jī)制,都是從應(yīng)用的角度來說明,rust 所有權(quán)底層是如何實(shí)現(xiàn)會(huì)在后續(xù)的內(nèi)容中介紹。 理解 RUST 所有權(quán)規(guī)則: RUST 中的每個(gè)值都有一個(gè)對應(yīng)的變量作為它的所有者 同一時(shí)間內(nèi),值有且僅有一個(gè)所有者 當(dāng)所有者離開自己的作用域時(shí),它

    2024年02月16日
    瀏覽(17)
  • Rust-解引用

    Rust-解引用

    “解引用”(Deref)是“取引用”(Ref)的反操作。取引用,我們有、mut等操作符,對應(yīng)的,解引用,我們有 操作符,跟C語言是一樣的。示例如下: 比如說,我們有引用類型p:i32;,那么可以用 符號(hào)執(zhí)行解引用操作。上例中,v1的類型是i32,p的類型是i32,*p的類型又返回i32。 解引用操作

    2024年01月19日
    瀏覽(12)
  • 【rust/esp32】wsl2開發(fā)環(huán)境搭建與測試

    【rust/esp32】wsl2開發(fā)環(huán)境搭建與測試

    esp型號(hào):esp32s3 開發(fā)環(huán)境:wsl2 rustc版本:rustc 1.73.0-nightly esp idf版本:v5.1.1 目前是按照這個(gè)demo的流程可以跑通 修改demo中的部分代碼,不然可能跑不通 以下這些問題奇奇怪怪,主要可能還是 rust toolchain 沒有安裝對 還有就是按照rust build中 espup 的流程執(zhí)行之后,我還是繼續(xù)執(zhí)行

    2024年02月08日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包