最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust中的&和ref使用解讀

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

Rust中的&和ref使

1. & 和 ref 都是用來定義指針的

廢話少說,先看代碼:

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
}

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

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

看一段代碼:

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

在函數(shù)傳參的時(shí)候用到了 & 來表示傳入?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)用語義是說,要把 a 的值復(fù)制到棧空間,因此,fn foo(ref mut x: i32) 中參數(shù) x 引用的是棧上的數(shù)據(jù)。也就是說,不管函數(shù)的參數(shù) x 如何聲明,foo(a) 這種形式傳入?yún)?shù) a,都不可能修改變量 a 的值。我覺得這個(gè)規(guī)定是合理的,比 C++ 的引用的語義聲明簡單、合理多了。

我們再修改一下:

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

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

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

看下面的代碼:

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

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

編譯提示如下:

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

修改后代碼如下:

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

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

我試了一下,不用 ref 的話,還有一個(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調(diào)用tree-sitter支持自定義語言解析

    詳解Rust調(diào)用tree-sitter支持自定義語言解析

    使用Rust語言結(jié)合tree-sitter庫解析自定義語言需要定義語法、生成C解析器,并在Rust項(xiàng)目中集成,具體步驟包括創(chuàng)建grammar.js定義語法,使用tree-sitter-cli工具生成C解析器,以及在Rust項(xiàng)目中編寫代碼調(diào)用解析器,這一過程涉及到對(duì)tree-sitter的深入理解和Rust語言的應(yīng)用技巧
    2024-09-09
  • 詳解Rust 生命周期符號(hào)使用的方法和規(guī)律

    詳解Rust 生命周期符號(hào)使用的方法和規(guī)律

    生命周期是 Rust 中處理引用和所有權(quán)的關(guān)鍵概念,通過正確使用生命周期符號(hào)和遵循相關(guān)規(guī)律,你可以編寫出安全、高效的 Rust 代碼,這篇文章主要介紹了Rust 生命周期符號(hào)使用的方法和規(guī)律,需要的朋友可以參考下
    2024-03-03
  • C和Java沒那么香了,Serverless時(shí)代Rust即將稱王?

    C和Java沒那么香了,Serverless時(shí)代Rust即將稱王?

    Serverless Computing,即”無服務(wù)器計(jì)算”,其實(shí)這一概念在剛剛提出的時(shí)候并沒有獲得太多的關(guān)注,直到2014年AWS Lambda這一里程碑式的產(chǎn)品出現(xiàn)。Serverless算是正式走進(jìn)了云計(jì)算的舞臺(tái)
    2021-06-06
  • Rust使用kind進(jìn)行異常處理(錯(cuò)誤的分類與傳遞)

    Rust使用kind進(jìn)行異常處理(錯(cuò)誤的分類與傳遞)

    Rust?有一套獨(dú)特的處理異常情況的機(jī)制,它并不像其它語言中的?try?機(jī)制那樣簡單,這篇文章主要介紹了Rust指南錯(cuò)誤的分類與傳遞以及使用kind進(jìn)行異常處理,需要的朋友可以參考下
    2022-09-09
  • Rust使用csv crate構(gòu)建CSV文件讀取器的全過程

    Rust使用csv crate構(gòu)建CSV文件讀取器的全過程

    這篇文章主要學(xué)習(xí)如何基于Rust使用csv這個(gè)crate構(gòu)建一個(gè)CSV文件讀取器的過程,學(xué)習(xí)了csv相關(guān)的用法以及一些往期學(xué)過的crate的復(fù)習(xí),兼顧了實(shí)用性和Rust的學(xué)習(xí),需要的朋友可以參考下
    2024-05-05
  • Rust中的Drop特性之解讀自動(dòng)化資源清理的魔法

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

    Rust通過Drop特性實(shí)現(xiàn)了自動(dòng)清理機(jī)制,確保資源在對(duì)象超出作用域時(shí)自動(dòng)釋放,避免了手動(dòng)管理資源時(shí)可能出現(xiàn)的內(nèi)存泄漏或雙重釋放問題,智能指針如Box、Rc和RefCell都依賴于Drop來管理資源,提供了靈活且安全的資源管理方案
    2025-02-02
  • Rust重載運(yùn)算符之復(fù)數(shù)四則運(yùn)算的實(shí)現(xiàn)

    Rust重載運(yùn)算符之復(fù)數(shù)四則運(yùn)算的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Rust如何實(shí)現(xiàn)復(fù)數(shù)以及復(fù)數(shù)的四則運(yùn)算,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • rust引用和借用的使用小結(jié)

    rust引用和借用的使用小結(jié)

    在rust中,引用的語法非常簡單。通過&來取引用,通過*來解引用,這篇文章主要介紹了rust引用和借用的使用小結(jié),總的來說,借用規(guī)則,同一時(shí)刻,你只能擁有要么一個(gè)可變引用,?要么任意多個(gè)不可變引用,具體內(nèi)容詳情跟隨小編一起看看吧
    2023-01-01
  • Rust語言從入門到精通系列之Iterator迭代器深入詳解

    Rust語言從入門到精通系列之Iterator迭代器深入詳解

    這篇文章主要為大家介紹了Rust語言從入門到精通系列之Iterator迭代器深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Rust使用Channel實(shí)現(xiàn)跨線程傳遞數(shù)據(jù)

    Rust使用Channel實(shí)現(xiàn)跨線程傳遞數(shù)據(jù)

    消息傳遞是一種很流行且能保證安全并發(fā)的技術(shù),Rust也提供了一種基于消息傳遞的并發(fā)方式,在rust里使用標(biāo)準(zhǔn)庫提供的Channel來實(shí)現(xiàn),下面我們就來學(xué)習(xí)一下如何使用Channel實(shí)現(xiàn)跨線程傳遞數(shù)據(jù)吧
    2023-12-12

最新評(píng)論

垦利县| 沭阳县| 延吉市| 大渡口区| 桂平市| 淳化县| 广昌县| 苗栗市| 伊宁县| 周宁县| 石泉县| 葫芦岛市| 无极县| 布尔津县| 宝丰县| 肇东市| 衡山县| 开阳县| 廊坊市| 武功县| 黄陵县| 漳浦县| 大英县| 金山区| 松溪县| 彭泽县| 镇平县| 牟定县| 兴和县| 东城区| 福清市| 达拉特旗| 仁寿县| 贺州市| 甘泉县| 独山县| 普兰店市| 伊春市| 承德县| 铅山县| 乐清市|