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

Rust所有權(quán)機(jī)制

這篇具有很好參考價(jià)值的文章主要介紹了Rust所有權(quán)機(jī)制。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

所有權(quán)機(jī)制是Rust的核心功能之一,對(duì)于初學(xué)者算是一個(gè)重難點(diǎn),它保證了程序無(wú)需GC,即可自動(dòng)化的釋放內(nèi)存
希望這篇博客可以幫助你快速理解所有權(quán)機(jī)制

概念

Rust的值都只有一個(gè)變量是該值的所有者
所有者可以切換,但是值在任一時(shí)刻有且僅有一個(gè)所有者
當(dāng)所有者離開(kāi)作用域,該值將被丟棄

錯(cuò)誤示例

在變量的作用域之外訪問(wèn)該變量

fn main() {
    {
        let s = String::from("hello"); // 創(chuàng)建字符串,該字符串的所有者是變量s
    } // 離開(kāi)作用域,該字符串被丟棄
    println!("{}", s); // 編譯報(bào)錯(cuò),此時(shí)變量s已被釋放,無(wú)法訪問(wèn)變量s
}

訪問(wèn)一個(gè)所有權(quán)被轉(zhuǎn)移的變量

fn main() {
	let s = String::from("hello"); // 創(chuàng)建字符串,該字符串的所有者是變量s
    let a = s; // 字符串的所有權(quán)從變量s傳遞給變量a
	println!("{}",s); // 編譯報(bào)錯(cuò),此時(shí)字符串的所有權(quán)已被轉(zhuǎn)移,無(wú)法在通過(guò)變量s訪問(wèn)字符串
}

訪問(wèn)一個(gè)所有權(quán)被轉(zhuǎn)移的變量

fn main() {
	let s = String::from("hello"); // 創(chuàng)建字符串,該字符串的所有者是變量s
    takes_ownership(s); // 字符串的所有權(quán)從變量s傳遞給函數(shù)takes_ownership
	println!("{}",s); // 編譯報(bào)錯(cuò),此時(shí)字符串的所有權(quán)已被轉(zhuǎn)移,無(wú)法在通過(guò)變量s訪問(wèn)字符串
}

fn takes_ownership(s: String) {
	println!("我拿到了字符串\"{}\"的所有權(quán)", s); // 拿到字符串的所有權(quán)
} // 離開(kāi)作用域,該字符串被丟棄

借用

在上述錯(cuò)誤示例中,我們不難發(fā)現(xiàn),如果我們把String字符串的所有權(quán)傳遞給函數(shù),那么等到函數(shù)結(jié)束,我們就無(wú)法在使用該字符串了,對(duì)于我們,這顯然是無(wú)法接受的,那么幾種解決方法解決這個(gè)問(wèn)題,例如

fn main() {
    let mut s = String::from("hello");
    s = takes_ownership(s);
    println!("{}", s);
}

fn takes_ownership(s: String) -> String {
	println!("我拿到了字符串\"{}\"的所有權(quán)", s); // 拿到字符串的所有權(quán)
    s // 返回該字符串
}
fn main() {
    let mut s = String::from("hello");
    s = takes_ownership(s);
    println!("{}", s);
}

fn takes_ownership(s: String) -> String {
	println!("我拿到了字符串\"{}\"的所有權(quán)", s); // 拿到字符串的所有權(quán)
    s // 返回該字符串
}

但是上述做法并不優(yōu)雅,Rust推薦的做法是我們通過(guò)借用來(lái)解決這個(gè)問(wèn)題,借用就是創(chuàng)建一個(gè)引用的行為,例如

fn main() {
	let s = String::from("hello");
    takes_ownership(&s); // 將字符串的引用傳遞給函數(shù)
    println!("{}", s);
}

fn takes_ownership(s: &String) { // 借用到字符串的引用
	println!("我借用到了字符串\"{}\"的引用", s);
} // 此時(shí)字符串的所有權(quán)并沒(méi)傳遞給函數(shù),應(yīng)此該函數(shù)沒(méi)有資格釋放該字符串

如果我們需要在函數(shù)內(nèi)部修改字符串,那么我們可以借用字符串的可變引用

fn main() {
	let mut s = String::from("hello");
    takes_ownership(&mut s); // 將字符串的引用傳遞給函數(shù)
    println!("{}", s);
}

fn takes_ownership(s: &mut String) { // 借用到字符串的可變引用
	println!("我借用到了字符串\"{}\"的可變引用", s);
	s.push_str(" world"); // 修改該字符串
} // 此時(shí)字符串的所有權(quán)并沒(méi)傳遞給函數(shù),應(yīng)此該函數(shù)沒(méi)有資格釋放該字符串

可變引用雖好,但是有個(gè)注意事項(xiàng),就是同一時(shí)刻可變引用只能有一個(gè),當(dāng)存在可變引用的時(shí)候,就不能有不可變引用,但是當(dāng)可變引用不存在的時(shí)候,就可以存在數(shù)個(gè)不可變引用,例如

fn main() {
	let mut s = String::from("hello");
    let (a, b) = (&s, &s); // 借用兩個(gè)字符串的不可變引用
    println!("不可變借用a:{}, 不可變借用b:{}", a, b);
    let c = &mut s; // 借用字符串的可變引用,此時(shí)前面的兩個(gè)不可變引用不再生效
    c.push_str(" world");
    println!("{}", c);
}

還有一個(gè)注意事項(xiàng)就是,引用的內(nèi)容必須合法,例如下面的錯(cuò)誤示范文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-722584.html

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

fn dangle() -> &String {
    let s = String::from("hello"); // 創(chuàng)建字符串,該字符串的所有者是變量s
    &s // 返回字符串的引用,但是此時(shí)字符串要已經(jīng)離開(kāi)作用域被釋放了,因此當(dāng)函數(shù)結(jié)束,這個(gè)引用將是一個(gè)非法的懸垂引用,不過(guò)還好,在rust中這種行為無(wú)法通過(guò)編譯
}

引用規(guī)則總結(jié)

  1. 在任意時(shí)刻只能有一個(gè)可變引用,要么只能有多個(gè)不可變引用
  2. 引用必須有效

到了這里,關(guān)于Rust所有權(quán)機(jī)制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【Rust】所有權(quán)

    【Rust】所有權(quán)

    所有權(quán)是Rust最獨(dú)特的特性,它讓Rust無(wú)需GC(Garbage Collection)就可保證內(nèi)存安全。Rust的核心特性就是所有權(quán),所有程序在運(yùn)行時(shí)都必須管理它們使用計(jì)算機(jī)內(nèi)存的方式。有些語(yǔ)言有垃圾回收機(jī)制,在程序運(yùn)行時(shí)會(huì)不斷地尋找不再使用的內(nèi)存。在其他語(yǔ)言中,程序員必須顯式地

    2024年02月11日
    瀏覽(21)
  • Rust之所有權(quán)

    程序需要管理自己在運(yùn)行時(shí)使用的計(jì)算機(jī)內(nèi)部空間。Rust語(yǔ)言采用包含特定規(guī)則的所有權(quán)系統(tǒng)來(lái)管理內(nèi)存,這套規(guī)則允許編譯器在編譯的過(guò)程中執(zhí)行檢查工作,而不會(huì)產(chǎn)生任何的運(yùn)行時(shí)開(kāi)銷(xiāo)。 Rust中的每一個(gè)值都有一個(gè)對(duì)應(yīng)的變量作為它的所有者; 在同一時(shí)間內(nèi),值有且僅有一

    2024年02月16日
    瀏覽(21)
  • 【Rust】Rust學(xué)習(xí) 第四章認(rèn)識(shí)所有權(quán)

    【Rust】Rust學(xué)習(xí) 第四章認(rèn)識(shí)所有權(quán)

    所有權(quán)(系統(tǒng))是 Rust 最為與眾不同的特性,它讓 Rust 無(wú)需垃圾回收(garbage collector)即可保障內(nèi)存安全。因此,理解 Rust 中所有權(quán)如何工作是十分重要的。 4.1?所有權(quán) 所有運(yùn)行的程序都必須管理其使用計(jì)算機(jī)內(nèi)存的方式。一些語(yǔ)言中具有垃圾回收機(jī)制,在程序運(yùn)行時(shí)不斷地

    2024年02月13日
    瀏覽(21)
  • Rust-所有權(quán)(ownership)

    Rust入門(mén)學(xué)習(xí)系列-Rust 的核心功能(之一)是 所有權(quán)(ownership)。引入這個(gè)概念是為了更好的管理計(jì)算機(jī)的內(nèi)存。下面篇幅讓我們來(lái)研究下這個(gè)功能有什么神奇之處。 常見(jiàn)的編程語(yǔ)言中計(jì)算機(jī)內(nèi)存管理方式: Java:Java使用Java虛擬機(jī)(JVM)來(lái)管理計(jì)算機(jī)內(nèi)存。JVM有一個(gè)垃圾回收

    2024年02月19日
    瀏覽(31)
  • rust學(xué)習(xí)——棧、堆、所有權(quán)

    rust學(xué)習(xí)——棧、堆、所有權(quán)

    棧和堆是編程語(yǔ)言最核心的數(shù)據(jù)結(jié)構(gòu),但是在很多語(yǔ)言中,你并不需要深入了解棧與堆。 但對(duì)于 Rust 這樣的系統(tǒng)編程語(yǔ)言,值是位于棧上還是堆上非常重要, 因?yàn)檫@會(huì)影響程序的行為和性能。 棧和堆的核心目標(biāo)就是為程序在運(yùn)行時(shí)提供可供使用的內(nèi)存空間。 棧 棧按照順序存

    2024年02月07日
    瀏覽(31)
  • Rust-所有權(quán)和移動(dòng)語(yǔ)義

    Rust-所有權(quán)和移動(dòng)語(yǔ)義

    拿C語(yǔ)言的代碼來(lái)打個(gè)比方。我們可能會(huì)在堆上創(chuàng)建一個(gè)對(duì)象,然后使用一個(gè)指針來(lái)管理這個(gè)對(duì)象: 接下來(lái),我們可能需要使用這個(gè)對(duì)象: 然而,這段代碼之后,誰(shuí)能猜得到,指針p指向的對(duì)象究竟發(fā)生了什么?它是否被修改過(guò)了?它還存在嗎,是否已經(jīng)被釋放?是否有另外一個(gè)指

    2024年01月18日
    瀏覽(24)
  • Rust核心功能之一(所有權(quán))

    Rust核心功能之一(所有權(quán))

    目錄 1、什么是所有權(quán)? 1.1?所有權(quán)規(guī)則 ?1.2 變量作用域 1.3 String 類(lèi)型 1.4 內(nèi)存與分配 變量與數(shù)據(jù)交互的方式(一):移動(dòng) 變量與數(shù)據(jù)交互的方式(二):克隆 只在棧上的數(shù)據(jù):拷貝 1.5 所有權(quán)與函數(shù) 1.6 返回值與作用域 所有權(quán)(系統(tǒng))是 Rust 最為與眾不同的特性,對(duì)語(yǔ)言的

    2024年02月04日
    瀏覽(35)
  • Rust語(yǔ)法:所有權(quán)&引用&生命周期

    Rust語(yǔ)法:所有權(quán)&引用&生命周期

    垃圾回收管理內(nèi)存 Python,Java這類(lèi)語(yǔ)言在管理內(nèi)存時(shí)引用了一種叫做垃圾回收的技術(shù),這種技術(shù)會(huì)為每個(gè)變量設(shè)置一個(gè)引用計(jì)數(shù)器(reference counter),來(lái)統(tǒng)計(jì)每個(gè)對(duì)象的引用次數(shù)。 一旦某個(gè)對(duì)象的引用數(shù)為0,垃圾回收器就會(huì)擇取一個(gè)時(shí)機(jī)將其所占用的空間回收。 以Python為例子

    2024年02月12日
    瀏覽(23)
  • 30天拿下Rust之所有權(quán)

    概述 ????????在編程語(yǔ)言的世界中,Rust憑借其獨(dú)特的所有權(quán)機(jī)制脫穎而出,為開(kāi)發(fā)者提供了一種新穎而強(qiáng)大的工具來(lái)防止內(nèi)存錯(cuò)誤。這一特性不僅確保了代碼的安全性,還極大地提升了程序的性能。在Rust中,所有權(quán)是一種編譯時(shí)檢查機(jī)制,用于追蹤哪些內(nèi)存或資源何時(shí)可

    2024年03月08日
    瀏覽(24)
  • 【跟小嘉學(xué) Rust 編程】四、理解 Rust 的所有權(quán)概念

    【跟小嘉學(xué) Rust 編程】四、理解 Rust 的所有權(quán)概念

    【跟小嘉學(xué) Rust 編程】一、Rust 編程基礎(chǔ) 【跟小嘉學(xué) Rust 編程】二、Rust 包管理工具使用 【跟小嘉學(xué) Rust 編程】三、Rust 的基本程序概念 【跟小嘉學(xué) Rust 編程】四、理解 Rust 的所有權(quán)概念 本章節(jié)將講解 Rust 獨(dú)有的概念(所有權(quán))。所有權(quán)是 Rust 最獨(dú)特的特性,它使得 Rust 能夠

    2024年02月10日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包