精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何在十分鐘內掌握Rust引用?

開發 前端
讓我們回顧一下引用規則,一個或多個不可變引用,或者僅僅是一個可變引用。在本例中,我們創建了兩個可變引用,借用檢查器將拒絕它們。但是這個規則實際上是有意義的,它可以保護免受內存損壞錯誤的影響。

近年來,Rust已經迅速成為最流行和增長最快的編程語言之一。谷歌和微軟等大型科技公司正在使用和投資它。它是一種允許帶有特殊約束的手動內存管理的語言,這在很大程度上確保了內存安全。

然而,Rust使用的約束(通常稱為借用檢查器)可能非常難以學習。嗯,如果你沒有正確學習的話。

這篇文章可以使你快速學習Rust中正確的引用概念。前提是你有一些Rust的基礎知識,比如結構體、函數和向量。

什么是引用?

引用是指在不顯式復制的情況下引用某些數據或變量的方法。Rust的引用與C和C++中的非混淆指針相同。在C和C++中,非混淆指針都是用restrict關鍵字定義的。在Rust中,引用采用的正是這種行為。但是,任何使引用相互命名別名的嘗試,無論是使用unsafe塊還是使用Rust的指針(這是另一個主題),都將導致未定義的行為。不要這樣做。

在Rust中,有四種方法可以將變量“傳遞”或轉移到函數或作用域之外。

1,移動變量:默認情況下,Rust會在賦值或從函數返回值時移動值。移動意味著一旦變量被移動,就不能在之前的位置使用它。

2,傳遞不可變引用:不可變引用是一種從另一個作用域引用變量的方法,只要該引用不會超出它所引用的變量的作用域。在Rust中,這被稱為生命周期。可以有一個或多個對變量的不可變引用。

3,傳遞可變引用:可變引用是引用來自另一個作用域的變量的一種方式,適用于類似的生命周期規則。但是,一個變量一次只有一個可變引用。這意味著在任何給定時間,任何變量都只能通過單個引用進行修改。

4,傳遞副本:在Rust中,不同的類型可以實現Copy或Clone特征,這樣它們就可以隱式或顯式地復制。Copy和Clone之間的主要區別在于前者是一個字節一個字節的memcpy風格復制,而Clone是顯式實現的一個成員一個成員的復制,可以使用自定義邏輯。

規則

引用的第一個也是最重要的規則是只有一個可變引用或多個不可變引用。但有一個問題是,這在實踐中看起來如何?讓我們來看幾個例子,從下面這個開始:

fn main() {
    let mut a = 6;
    let b = &a;
    let c = &mut a;
    println!("{}", *c);
}

上面的代碼實際上是有效的,你可能會認為同時存在不可變引用和可變引用。然而,需要注意的是,代碼只使用了c,沒有使用b下的不可變引用。由于這個原因,Rust的借用檢查器不會報錯。但是讓我們看看當我們開始使用b時會發生什么:

fn main() {
    let mut a = 6;
    let b = &a;
    let c = &mut a;
    println!("{}", *b);
}

這會導致編譯失敗:

error[E0502]: cannot borrow `a` as mutable because it is also borrowed as immutable
 --> src/main.rs:7:13
  |
6 |     let b = &a;
  |             -- immutable borrow occurs here
7 |     let c = &mut a;
  |             ^^^^^^ mutable borrow occurs here
8 |     println!("{}", *b);
  |                    -- immutable borrow later used here

For more information about this error, try `rustc --explain E0502`.

b被println!借走了,這會導致不可變和可變引用不能同時存在的規則被打破。

接下來,讓我們看一個更復雜的例子:

fn main() {
    let mut a = 6;
    let mut b = &a;
    let c = &mut b;
    println!("{}", *c);
}

乍一看,這看起來像是對同一個變量取了一個可變引用和一個不可變引用。然而,理解引用既是類型又是操作符是至關重要的。當使用引用操作符時,它接受與該操作符一起使用的變量的引用。

這意味著,c是對整數引用的可變引用。這個引用的Rust類型看起來像&mut&usize。在上面的代碼中,c可以被解引用并指向一個不同的&usize引用,這個引用會改變b,但不會改變a。如果我們試圖通過c來改變a,如下:

fn main() {
    let mut a = 6;
    let mut b = &a;
    let c = &mut b;
    **c += 1;
    println!("{}", *c);
}

會出現以下錯誤:

error[E0594]: cannot assign to `**c`, which is behind a `&` reference
 --> src/main.rs:8:5
  |
8 |     **c += 1;
  |     ^^^^^^^^ cannot assign

引用,類似于C/C++中的指針,可以形成任意長度的復合類型,這樣,&mut&mut&usize也可以作為Rust引用存在。與指針不同的是,引用的生命周期必須足夠長,否則,借用檢查器會讓你止步不前。

生命周期

在這里,我們可以探索各種引用的生命周期,并了解何時創建和銷毀引用(或者像Rust所說的“drop”)。下面的例子:

fn main() {
    let mut a = 6;
    let mut b = &a;
    {
        let c = 7;
        b = &c;
    }
    println!("{}", *b);
}

產生錯誤:

error[E0597]: `c` does not live long enough
  --> src/main.rs:9:13
   |
8  |         let c = 7;
   |             - binding `c` declared here
9  |         b = &c;
   |             ^^ borrowed value does not live long enough
10 |     }
   |     - `c` dropped here while still borrowed
11 |     println!("{}", *b);
   |                    -- borrow later used here

在內部作用域中,b被改變為保存對c的引用。但是一旦內部作用域結束,c就不存在了。因此,在這種情況下,引用比它引用的變量生命周期更長,所以產生了錯誤。

同樣的規則不適用于副本,因為副本是彼此獨立存在的。如果采用相同的代碼來刪除引用的使用:

fn main() {
    let mut a = 6;
    let mut b = a;
    {
        let c = 7;
        b = c;
    }
    println!("{}", b);
}

代碼編譯沒有錯誤。由于整數相對較小,因此通常可以復制它們。然而,更大的類型使用引用計數或按引用傳遞,以避免性能下降。

基于作用域的生命周期規則也適用于在較大的類實例中獲取引用。

struct Container(Vec<u64>);

impl Container {
    fn get(&self, index:usize) -> &u64 {
        &self.0[index]
    }
}

在上面的代碼中,get返回對vector中的引用,但是vector的生命周期必須比返回的引用長。如果我們應用同樣的邏輯,

fn main() {
    let m = Container(vec![1, 2, 3]);
    let mut the_ref = m.get(0);
    {
        let d = Container(vec![1, 2, 3]);
        the_ref = d.get(1);
    }
    println!("{}", the_ref);
}

此代碼也無法編譯,并出現類似的錯誤

error[E0597]: `d` does not live long enough
  --> src/main.rs:15:19
   |
14 |         let d = Container(vec![1, 2, 3]);
   |             - binding `d` declared here
15 |         the_ref = d.get(1);
   |                   ^ borrowed value does not live long enough
16 |     }
   |     - `d` dropped here while still borrowed
17 |     println!("{}", the_ref);
   |                    ------- borrow later used here

當某些東西在Rust中被刪除時,所有實現Drop特性的成員也將被刪除。

迭代和引用

當在迭代或循環中使用引用時,有幾種獨特的行為。如果迭代也是不可變的,則對集合類型的迭代,通常使循環充當該集合上的不可變借用的作用域。以下代碼為例:

fn main() {
    let mut a = vec![1, 2, 3, 4];
    for elem in a.iter() {
        if *elem % 2 == 0 {
            a.remove(*elem);
        }
    }
}

會導致編譯錯誤:

error[E0502]: cannot borrow `a` as mutable because it is also borrowed as immutable
 --> src/main.rs:8:13
  |
6 |     for elem in a.iter() {
  |                 --------
  |                 |
  |                 immutable borrow occurs here
  |                 immutable borrow later used here
7 |         if *elem % 2 == 0 {
8 |             a.remove(*elem);
  |             ^^^^^^^^^^^^^^^ mutable borrow occurs here

Rust遵循這樣的規則:對某種類型的不可變迭代是一系列不可變借用,因此,不能在該迭代期間可變地借用相同的類型。

現在,你可能會認為這段特定代碼的解決方案是對其進行可變迭代。然而,這仍然是不正確的!如果將iter()改為iter_mut():

fn main() {
    let mut a = vec![1, 2, 3, 4];
    for elem in a.iter_mut() {
        if *elem % 2 == 0 {
            a.remove(*elem);
        }
    }
}

會出現以下錯誤:

error[E0499]: cannot borrow `a` as mutable more than once at a time
 --> src/main.rs:8:13
  |
6 |     for elem in a.iter_mut() {
  |                 ------------
  |                 |
  |                 first mutable borrow occurs here
  |                 first borrow later used here
7 |         if *elem % 2 == 0 {
8 |             a.remove(*elem);
  |             ^ second mutable borrow occurs here

讓我們回顧一下引用規則,一個或多個不可變引用,或者僅僅是一個可變引用。在本例中,我們創建了兩個可變引用,借用檢查器將拒絕它們。但是這個規則實際上是有意義的,它可以保護免受內存損壞錯誤的影響。

根據集合的內部實現,修改集合類型會使現有迭代器失效。這可能是因為集合處理的內存塊可能被分配或釋放,從而導致懸空指針,但是可變引用規則有效地防止了這種情況。

責任編輯:武曉燕 來源: coding到燈火闌珊
相關推薦

2022-08-26 09:01:07

CSSFlex 布局

2024-10-25 15:56:20

2020-12-17 06:48:21

SQLkafkaMySQL

2019-04-01 14:59:56

負載均衡服務器網絡

2023-09-26 22:12:13

數據倉庫Doris

2009-10-09 14:45:29

VB程序

2023-10-07 00:06:09

SQL數據庫

2021-07-29 08:57:23

ViteReact模塊

2021-09-07 09:40:20

Spark大數據引擎

2022-06-16 07:31:41

Web組件封裝HTML 標簽

2024-06-19 09:58:29

2023-04-12 11:18:51

甘特圖前端

2023-11-30 10:21:48

虛擬列表虛擬列表工具庫

2024-05-13 09:28:43

Flink SQL大數據

2015-09-06 09:22:24

框架搭建快速高效app

2012-07-10 01:22:32

PythonPython教程

2023-10-07 13:13:24

機器學習模型數據

2023-07-15 18:26:51

LinuxABI

2024-11-07 16:09:53

2019-09-16 09:14:51

點贊
收藏

51CTO技術棧公眾號

一区二区精品在线| 日韩专区中文字幕| 亚洲欧美日韩精品在线| 精品无码久久久久| 欧美videos粗暴| 99视频在线精品| 久久九九热免费视频| 啊啊啊一区二区| 国产理论片在线观看| 亚洲人成亚洲精品| 亚洲精品va在线观看| 国产精品视频网| 精品人妻一区二区三区香蕉| a级影片在线观看| 免费在线观看日韩欧美| 精品一区精品二区| 国产日韩欧美精品在线观看| 99久久国产热无码精品免费| 日韩电影免费网站| 91久久精品国产91性色tv| 国产一区不卡在线观看| 欧美激情一区二区视频| 亚洲精品伦理| 国产精品视频在线看| 日韩av日韩在线观看| 最近日本中文字幕| 9765激情中文在线| 国产91高潮流白浆在线麻豆 | 国产精品久久久久精k8| 欧美中文在线免费| 少妇特黄一区二区三区| 日韩欧美精品一区二区三区经典| 中文字幕永久有效| 成年人在线观看视频| 日韩成人a**站| 精品久久久久久亚洲国产300| 国产精品美女黄网| 国产一级在线免费观看| 亚洲一区二区电影| 夜夜嗨av一区二区三区网页| 97碰碰视频| 久久亚洲AV无码| 久久九九热re6这里有精品| 亚洲国产精品一区二区尤物区| 97在线电影| 久久综合成人网| 精品在线网站观看| 精品久久久久久中文字幕一区奶水 | 一区二区三区四区国产精品| 91在线看www| 日韩在线观看视频一区二区| 中文字幕亚洲在线观看| 亚洲国产wwwccc36天堂| 九九九九九精品| 波多野结衣黄色| 日韩精品一卡| 日韩一级黄色片| 欧美日韩福利在线| 黄上黄在线观看| 久久国产精品第一页| 欧美乱大交xxxxx另类电影| 亚洲天堂av网站| 欧美日韩电影免费看| 国产精品伦一区| 99国产超薄肉色丝袜交足的后果| 日本少妇吞精囗交| blacked蜜桃精品一区| 在线成人午夜影院| 国产精品专区在线| 亚洲日本中文字幕在线| 日韩和欧美一区二区三区| 久久香蕉国产线看观看网| 永久免费未满蜜桃| 国产黄色精品| 亚洲成人7777| 亚洲欧美日韩精品综合在线观看| 性生交生活影碟片| 久久一区精品| 欧美激情18p| 99精品全国免费观看| 伊人久久影院| 在线观看国产91| 欧美狂野激情性xxxx在线观| 国产毛片在线看| 国产精品一区二区免费不卡| 人妖精品videosex性欧美| 91插插插插插插| 欧美精品一区二区久久| 精品福利一区二区三区免费视频| 宅男噜噜噜66国产免费观看| 国产后进白嫩翘臀在线观看视频| 国产欧美日韩精品一区| 国产伦精品一区二区三区照片 | 日韩av中文在线观看| 欧美激情国产精品| 可以免费看av的网址| 亚洲系列另类av| 精品成人免费观看| 交换做爰国语对白| 97久久网站| 色婷婷久久99综合精品jk白丝| 黄网站色视频免费观看| 最新真实国产在线视频| 久久―日本道色综合久久| 99一区二区三区| 国产精品久久久久久无人区| 免费在线看一区| 日韩免费视频在线观看| 圆产精品久久久久久久久久久| 中文字幕一区二区精品区| 日韩中文字幕不卡视频| 成人国产精品久久久网站| 日韩av三区| 欧美精品一区二区不卡| 亚洲精品一二三四| 国产电影一区二区| 9191久久久久久久久久久| 噼里啪啦国语在线观看免费版高清版| 多野结衣av一区| 亚洲成人手机在线| 欧美高清中文字幕| 国产丝袜精品丝袜| 亚洲综合激情小说| 国产欧美精品aaaaaa片| 欧美黄色视屏| 亚洲无人区一区| 欧美a级黄色大片| av观看在线| 一区二区三区日韩在线观看| 久久香蕉视频网站| 91九色国产在线播放| 亚洲香肠在线观看| 国产日韩av网站| 免费在线小视频| 欧美性生交xxxxxdddd| 1024精品视频| 欧美xnxx| 欧美区在线观看| 性色av浪潮av| 国产一级成人av| 日韩黄色高清视频| 一区二区三区伦理片| 国产日产精品_国产精品毛片| 亚洲欧洲一区二区三区久久| 快灬快灬一下爽蜜桃在线观看| 日韩精品91| 久久亚洲一区二区三区四区五区高 | 欧美成人第一页| 国产午夜福利片| 国产毛片一区| 国产裸体写真av一区二区| 国产老妇伦国产熟女老妇视频| 国产精品一二三区| 精品91免费| 二区在线观看| 亚洲精品视频免费观看| 成年人网站免费视频| 日韩欧美一区二区三区在线观看| 欧美唯美清纯偷拍| 精品人妻一区二区三| 欧美综合自拍| 日韩中文有码在线视频| 国产精品第一页在线观看| 爽好久久久欧美精品| 国产在线观看精品一区二区三区| 亚洲AV无码乱码国产精品牛牛| 99re8在线精品视频免费播放| 日本在线播放不卡| 中文字幕有码在线观看| 欧美性色视频在线| 亚洲av无码久久精品色欲| 妖精视频一区二区三区| 久久伊人精品天天| 久久久久99精品成人片我成大片| 九色porny丨国产精品| 国产精品日韩欧美一区二区三区| 国产污视频在线| 亚洲一区二区三区影院| 日日噜噜噜噜久久久精品毛片| youjizz欧美| 色午夜这里只有精品| 国产污视频在线观看| 免费观看久久久4p| 精品国产综合| av中文字幕在线播放| 色狠狠综合天天综合综合| gogo亚洲国模私拍人体| 成人免费a**址| 性色av香蕉一区二区| 国产乱人乱偷精品视频| 国产网站一区二区三区| 久久精品国产sm调教网站演员| 欧美激情福利| 亚洲欧美色图片| www.天天色| 国产精品白丝av| 亚洲欧洲一区二区福利| 男人最爱成人网| 亚洲精品wwwww| 免费毛片在线播放免费| 蜜桃视频免费观看一区| 欧美日韩国产精品一卡| 春色校园综合激情亚洲| 精品国产制服丝袜高跟| 亚洲区一区二区三| 免费看精品久久片| 日产精品高清视频免费| 中文在线аv在线| 亚洲国产精品久久91精品| 九九视频免费在线观看| 国产一区二区看久久| 中文字幕久久综合| 国产成人77亚洲精品www| 亚洲性视频网址| 亚洲综合久久网| 久久综合给合久久狠狠狠97色69| 9久久9毛片又大又硬又粗| 69精品国产久热在线观看| 欧美风情在线观看| 亚洲经典一区二区三区| 一区二区久久久久久| 亚洲国产综合av| 欧美日本三区| 97av影视网在线观看| 美足av综合网| 亚洲国产精品女人久久久| 懂色av.com| 99re热这里只有精品免费视频| 国产 福利 在线| 麻豆精品av| 欧美一区二区三区精品电影| 日韩美女一级视频| 在线观看免费视频综合| 欧美人与禽zoz0善交| 久久99精品国产| 穿情趣内衣被c到高潮视频| 欧美高清一级片| 久久久久久这里只有精品| 无码国产精品一区二区免费16| 欧美午夜电影在线| 四虎国产精品成人免费入口| 日本欧美加勒比视频| 一区二区在线观| av成人男女| 日韩美女写真福利在线观看| av一区在线观看| 91精品国产综合久久精品app| 欧美精品入口蜜桃| 99视频精品免费视频| av五月天在线| 国产大片一区| 国产日韩欧美一区二区三区四区| 伊人网在线播放| 日韩中文字幕在线观看| 精品国产黄色片| 精品福利视频导航| 最新日韩免费视频| 丰满少妇久久久久久久| 北条麻妃69av| 99久久精品国产亚洲精品| 成人91视频| 蜜桃精品在线| 久久久女女女女999久久| 黄色小视频在线免费观看| 91精品久久久久久久91蜜桃 | 亚洲乱码免费伦视频| 国产一区免费观看| 日本免费一区二区三区等视频| 欧美黄色性视频| 91社区在线高清| 亚洲高清不卡av| 91福利免费视频| 精品免费在线视频| 无码黑人精品一区二区| 91麻豆免费观看| 在线播放黄色av| 久久国产精品亚洲77777| 可以免费看的黄色网址| 亚洲性视频大全| 国产精品 日韩| 91成人小视频| 国产精品第10页| 国产不卡人人| 久青草视频在线观看| 一区视频在线| 无码免费一区二区三区免费播放 | 99在线观看视频| 成人mm视频在线观看| 欧美激情欧美激情在线五月| 亚洲欧美视频一区二区| 日韩精品中文字幕有码专区| 成人av一区二区三区在线观看| 欧美偷拍一区二区| 在线观看日韩中文字幕| 亚洲乱码精品一二三四区日韩在线| 丰满少妇高潮一区二区| 成人精品国产福利| 永久看看免费大片| 久久 天天综合| 性生活免费在线观看| 噜噜噜久久亚洲精品国产品小说| www.一区二区.com| 亚洲视频电影在线| 亚洲女人毛片| 欧美精品一区二区久久| 日本一区二区精品| 国精一区二区| 青青成人在线| 欧美人与物videos另类xxxxx| 精品久久sese| 久久影视三级福利片| 国产精品日韩欧美一区二区| 99香蕉久久| 国产一区二区三区四区五区加勒比| 日韩中文字幕一区二区高清99| 亚洲精品欧美日韩| 99综合久久| 91日韩在线播放| 精品99re| 成人免费在线看片| 好吊妞视频这里有精品| 国产精品一区二区三区免费| 999在线精品| 国产日韩欧美综合精品| 久久悠悠精品综合网| 久久久com| 国产一区二区精品久| 日韩精品一线二线三线| 久久国产中文字幕| 在线观看福利一区| 欧美在线免费一级片| 国产成人一区二区三区别| 日韩一级免费片| 亚洲黄色大片| 成年网站在线免费观看| 日韩av在线发布| www.com久久久| 国产精品系列在线播放| 99久久人妻精品免费二区| 久久综合九色综合欧美亚洲| www.99热| **性色生活片久久毛片| 黄色一级视频在线观看| 五月天欧美精品| 欧美亚洲另类小说| 欧美日韩高清一区二区| 亚洲av无码国产综合专区 | 欧美体内she精高潮| 成人国产亚洲欧美成人综合网 | 久久久久久国产精品三级玉女聊斋| a级片在线免费| 国产福利成人在线| 成人污版视频| 久久久国产精品一区二区三区| 全球成人免费直播| 免费网站在线观看视频 | 欧美做受高潮电影o| 欧美黄色a视频| 精品久久久久久中文字幕动漫| 精品国产一区二区三区久久久蜜臀 | 五月婷婷深深爱| 最近2019年手机中文字幕| 久草视频在线观| 免费看久久久| 国产精品青青草| 久久看人人摘| 高清无码一区二区在线观看吞精| 一区二区三区四区五区在线| 国产aaaaa毛片| 成人av网址在线| 国产探花视频在线| 五月婷婷激情综合| 国产一区二区在线视频聊天| 亚洲电影免费观看高清完整版在线| 久久久久久久影视| 久久国产精品久久国产精品| 性欧美xxx69hd高清| 91麻豆桃色免费看| 免费精品国产的网站免费观看| 男女裸体影院高潮| 日韩有码一区二区三区| 日本精品一二三区| 国产精品第13页| 狠狠躁夜夜躁人人爽天天高潮| 欧美日韩日日夜夜| 天堂a中文在线| 欧美激情亚洲另类| 四虎国产精品免费久久5151| 欧美精品一区二区三区在线四季| 欧美a级在线| 久久久久久三级| 久久亚洲捆绑美女| 久久久精品人妻一区二区三区四| 欧美无砖专区一中文字| 午夜av免费观看| 欧美激情xxxx性bbbb| 欧美1区2区3| 天堂av免费看| 麻豆传媒一区二区三区| 亚洲精品国产熟女久久久|