欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Rust中的&和ref使用解讀

 更新時(shí)間:2025年02月26日 11:39:28   作者:許野平  
在Rust中,`&`和`ref`都可以用來(lái)定義指針,但它們的使用位置不同,`&`通常放在等號(hào)右邊,而`ref`放在左邊,`&`主要用于函數(shù)參數(shù)和模式匹配中,而`ref`主要用于模式匹配中,Rust通過(guò)`&`和`ref`提供了靈活的指針操作,使得代碼更加安全和高效

Rust中的&和ref使

1. & 和 ref 都是用來(lái)定義指針的

廢話(huà)少說(shuō),先看代碼:

fn main() {
    let mut a: i32 = 111;

    let b = &a;
    println!("{}", *b); //111

    let ref c = a;
    println!("{}", *c); //111
}

而這結(jié)果一樣,都是在聲明一個(gè)指針。區(qū)別在那里?& 放在等號(hào)的右邊, ref 放在等好的左邊。

在看個(gè)例子,看看如何用指針修改變量:

fn main() {
    let mut a: i32 = 111;

    let b = &mut a; // 指針 b 本身是不可以修改的,但它指向的內(nèi)容是可以修改的。
    *b = 222;
    println!("{}", a); // 222

    let ref mut c = a; // 指針 c 本身是不可以修改的,但它指向的內(nèi)容是可以修改的。
    *c = 333;
    println!("{}", a); //333
}

在代碼行里,二者沒(méi)有任何區(qū)別。但是,為什么弄出兩個(gè)來(lái)呢?

2. 只能用 & 定義指針的地方

看一段代碼:

fn foo(x: &mut i32) {
    *x = 999;
}
fn main() {
    let mut a: i32 = 111;
    foo(&mut a);
    println!("{}", a); // 999
}

在函數(shù)傳參的時(shí)候用到了 & 來(lái)表示傳入?yún)?shù)棧的是一個(gè)可修改變量的地址。

下面我們修改一下,改成下面的代碼:

fn foo(ref mut x: i32) {
    *x = 999;
}
fn main() {
    let mut a: i32 = 111;
    foo(a);
    println!("{}", a); // 111
}

foo(a) 的調(diào)用語(yǔ)義是說(shuō),要把 a 的值復(fù)制到??臻g,因此,fn foo(ref mut x: i32) 中參數(shù) x 引用的是棧上的數(shù)據(jù)。也就是說(shuō),不管函數(shù)的參數(shù) x 如何聲明,foo(a) 這種形式傳入?yún)?shù) a,都不可能修改變量 a 的值。我覺(jué)得這個(gè)規(guī)定是合理的,比 C++ 的引用的語(yǔ)義聲明簡(jiǎn)單、合理多了。

我們?cè)傩薷囊幌拢?/p>

fn foo(ref x: &mut i32) {
    **x = 999;
}
fn main() {
    let mut a: i32 = 111;
    foo(&mut a);
    println!("{}", a); // 999
}

這次又成功了。但是這個(gè) **x 你不覺(jué)得麻煩吧?因此,在函數(shù)參數(shù)聲明中,一般只用 & 來(lái)傳入變量的地址。

3. 只能用 ref 定義指針的地方

看下面的代碼:

fn main() {
    let s = Some(String::from("Hello!"));
    match s {
        Some(t) => println!("t = {}", t),
        _ => {}
    }
    println!("s = {}", s.unwrap());
}

這個(gè)是無(wú)法編譯的。因?yàn)?match s 語(yǔ)句中,已經(jīng)把 s 的所有權(quán)給轉(zhuǎn)移了,導(dǎo)致最后一條語(yǔ)句無(wú)法執(zhí)行。

編譯提示如下:

編譯期建議在模式匹配中把變量 t 改成 ref t,也就是說(shuō)把 t 聲明成指針即可解決問(wèn)題。

修改后代碼如下:

fn main() {
    let s = Some(String::from("Hello!"));
    match s {
        Some(ref t) => println!("t = {}", t),
        _ => {}
    }
    println!("s = {}", s.unwrap());
}

因?yàn)樵谀J狡ヅ浯a塊中,我們沒(méi)有機(jī)會(huì)聲明變量類(lèi)型,只能用 ref 表示變量 t 是個(gè)指針。

我試了一下,不用 ref 的話(huà),還有一個(gè)變通的方法,就是把 match s 改成 match &s。

代碼如下:

fn main() {
    let s = Some(String::from("Hello!"));
    match &s {
        Some(t) => println!("t = {}", t),
        _ => {}
    }
    println!("s = {}", s.unwrap());
}

這個(gè)時(shí)候 t 前面加不加 ref 結(jié)果都一樣。因?yàn)?match 只是借用 s,所以不會(huì)影響 s 的生命周期。

4. 更多的試驗(yàn)

下面給出了一組代碼,我們看看那些是合法的,那些是非法的。

fn main() {
    let v = 123;

    let x: &i32 = &v; 					// OK!
    let x: &i32 = &(123 + 456); 		// OK!
    if let Some(x:&i32) = Some(&123); 	// Error!

    let ref x: i32 = v;					// OK!
    let ref x: i32 = 123 + 456;			// OK!
    if let Some(ref x) = Some(123) {}	// OK!
}

5. 指針變量的解引用

看下面代碼,道理我不多講了,rust 會(huì)自動(dòng)解多層嵌套引用,這個(gè)太方便了。

fn main() {
    let a: &i32 = &123;
    let b: &&i32 = &a;
    let c: &&&i32 = &b;

    println!("a = {}, b = {}, c = {}", a, b, c);
    println!("*a = {}, **b = {}, ***c = {}", *a, **b, ***c);
}

/* output
a = 123, b = 123, c = 123
*a = 123, **b = 123, ***c = 123
*/

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Rust中的Drop特性之解讀自動(dòng)化資源清理的魔法

    Rust中的Drop特性之解讀自動(dòng)化資源清理的魔法

    Rust通過(guò)Drop特性實(shí)現(xiàn)了自動(dòng)清理機(jī)制,確保資源在對(duì)象超出作用域時(shí)自動(dòng)釋放,避免了手動(dòng)管理資源時(shí)可能出現(xiàn)的內(nèi)存泄漏或雙重釋放問(wèn)題,智能指針如Box、Rc和RefCell都依賴(lài)于Drop來(lái)管理資源,提供了靈活且安全的資源管理方案
    2025-02-02
  • Rust中的方法與關(guān)聯(lián)函數(shù)使用解讀

    Rust中的方法與關(guān)聯(lián)函數(shù)使用解讀

    在Rust中,方法是定義在特定類(lèi)型(如struct)的impl塊中,第一個(gè)參數(shù)是self(可變或不可變),方法用于描述該類(lèi)型實(shí)例的行為,而關(guān)聯(lián)函數(shù)則不包含self參數(shù),常用于構(gòu)造新實(shí)例或提供一些與實(shí)例無(wú)關(guān)的功能,Rust的自動(dòng)引用和解引用特性使得方法調(diào)用更加簡(jiǎn)潔
    2025-02-02
  • 如何使用VSCode配置Rust開(kāi)發(fā)環(huán)境(Rust新手教程)

    如何使用VSCode配置Rust開(kāi)發(fā)環(huán)境(Rust新手教程)

    這篇文章主要介紹了如何使用VSCode配置Rust開(kāi)發(fā)環(huán)境(Rust新手教程),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Rust的泛型、Traits與生命周期用法及說(shuō)明

    Rust的泛型、Traits與生命周期用法及說(shuō)明

    本文通過(guò)一個(gè)尋找列表中最大值的示例,展示了如何從重復(fù)代碼中提取函數(shù),再利用泛型實(shí)現(xiàn)代碼復(fù)用,主要步驟包括:識(shí)別重復(fù)邏輯;抽象提??;泛型應(yīng)用;進(jìn)一步擴(kuò)展,通過(guò)不斷抽象和泛化,我們不僅能減少代碼重復(fù),還能寫(xiě)出更通用、健壯和可維護(hù)的代碼
    2025-02-02
  • Rust語(yǔ)言之trait中的個(gè)方法可以重寫(xiě)嗎

    Rust語(yǔ)言之trait中的個(gè)方法可以重寫(xiě)嗎

    在Rust中,trait定義了一組方法,這些方法可以被一個(gè)或多個(gè)類(lèi)型實(shí)現(xiàn),當(dāng)你為某個(gè)類(lèi)型實(shí)現(xiàn)一個(gè)trait時(shí),你可以為該trait中的每個(gè)方法提供自己的具體實(shí)現(xiàn),本文將給大家介紹一下trait中的個(gè)方法是否可以重寫(xiě),需要的朋友可以參考下
    2023-10-10
  • Rust?枚舉的使用學(xué)習(xí)筆記

    Rust?枚舉的使用學(xué)習(xí)筆記

    Rust中的枚舉是一種用戶(hù)定義的類(lèi)型,本文主要介紹了Rust枚舉的使用,它們不僅僅用于表示幾個(gè)固定的值,還可以包含函數(shù)和方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 詳解Rust中泛型的使用

    詳解Rust中泛型的使用

    泛型是一種在編寫(xiě)代碼時(shí)不指定具體類(lèi)型,而在使用時(shí)再確定類(lèi)型的編程技巧,本文將詳細(xì)介紹?Rust?中泛型的相關(guān)概念和用法,希望對(duì)大家有所幫助
    2023-06-06
  • Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制完整代碼

    Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制完整代碼

    在 Rust 中,如果想為enum實(shí)現(xiàn)一個(gè)帶多參數(shù)的 Hook 機(jī)制,可以結(jié)合模式匹配和枚舉來(lái)處理,這種方式可以擴(kuò)展到支持不同類(lèi)型的輸入?yún)?shù)和邏輯處理,下面通過(guò)示例代碼介紹Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制,感興趣的朋友一起看看吧
    2024-12-12
  • Rust你不認(rèn)識(shí)的所有權(quán)

    Rust你不認(rèn)識(shí)的所有權(quán)

    所有權(quán)對(duì)大多數(shù)開(kāi)發(fā)者而言是一個(gè)新穎的概念,它是 Rust 語(yǔ)言為高效使用內(nèi)存而設(shè)計(jì)的語(yǔ)法機(jī)制。所有權(quán)概念是為了讓 Rust 在編譯階段更有效地分析內(nèi)存資源的有用性以實(shí)現(xiàn)內(nèi)存管理而誕生的概念
    2023-01-01
  • Rust之智能指針的用法

    Rust之智能指針的用法

    在Rust中,智能指針是管理內(nèi)存所有權(quán)和生命周期的核心工具,本文主要介紹了Rust之智能指針的用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評(píng)論