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

Rust for循環(huán)語法糖背后的API場景分析

 更新時間:2022年11月07日 11:07:43   作者:pilaf1990  
for語句是一種能確定循環(huán)次數(shù)的循環(huán),for 語句用于執(zhí)行代碼塊指定的次數(shù),今天通過本文給大家介紹Rust for循環(huán)語法糖背后的API場景分析,感興趣的朋友跟隨小編一起看看吧

Rust中for循環(huán)實質(zhì)上是一個語法糖,in后面的對象要求是一個迭代器,for循環(huán)就是對這個迭代器循環(huán)調(diào)用next,而in前面的名稱就是每一次迭代后返回的結(jié)果,如果next返回Option::None則退出循環(huán)。了解這一點后我們可以自己編寫自己的迭代器類型,然后使用for循環(huán)進行迭代。

rust有三種for循環(huán),分別用于不同的場景。

1.拿走所有權(quán)的for循環(huán)

形式如:for item in collection(集合或容器類型)會拿走collection的所有權(quán)(ownership)。

fn main() {
    let collection: Vec<i32> = vec![1, 2, 4, 6, 9];

    // 注意這兒的item類型是i32
    for item in collection {
        println!("item:{}", item);
    }

    // for循環(huán)之后,不能再使用collection,因為collection的所有權(quán)已經(jīng)被拿走,且在for循環(huán)后collection已經(jīng)被drop掉了
    // println!("collection:{:?}", collection);
}

因為rust編譯器會將for item in collection替換成for item in IntoIterator::into_iter(collection)

fn main() {
    let collection: Vec<i32> = vec![1, 2, 4, 6, 9];

    // rust中的into_開頭的方法一般情況下都會拿走參數(shù)的所有權(quán)
    let iter = IntoIterator::into_iter(collection);
    // 從這兒開始,collection已經(jīng)不能再被使用,因為collection的所有權(quán)被轉(zhuǎn)移到into_iter方法中,當(dāng)方法執(zhí)行完,collection就被drop掉了 
    // println!("collection:{:?}", collection); // 如果這兒使用collection就會編譯報錯
    for item in iter{
        println!("item:{}", item);
    }
}

正如Rust官網(wǎng)https://doc.rust-lang.org/std/iter/trait.IntoIterator.html上說的:One benefit of implementing IntoIterator is that your type will work with Rust’s for loop syntax.,即實現(xiàn)IntoIterator trait能夠讓你自定義類型在for循環(huán)中使用。

Vec正是實現(xiàn)了IntoIterator,所以才可以在for循環(huán)中使用的:

2.只讀for循環(huán)

形式如:for item in &collection,不會拿走collection的所有權(quán),只會獲取它的不可變引用:

fn main() {
    let collection: Vec<i32> = vec![1, 2, 4, 6, 9];

    // 注意這兒item的類型是&i32,即它是對collection中元素的不可變引用
    for item in &collection {
        println!("item:{}", item);
    }

    println!("collection after for loop:{:?}", collection);
}

因為rust會將for item in &collection替換成for item in collection.iter():

fn main() {
    let collection: Vec<i32> = vec![1, 2, 4, 6, 9];

    // 注意這兒item的類型是&i32,即它是對collection中元素的不可變引用
    for item in collection.iter() { // 等價于for item in (&collection).iter() {
        println!("item:{}", item);
    }

    println!("collection after for loop:{:?}", collection);
}

迭代完集合中的元素后,集合還可以繼續(xù)使用。

3.讀寫for循環(huán)

形式如:for item in &mut collection,不會拿走collection的所有權(quán),只會獲取它的可變引用:

fn main() {
    // 注意,為了修改collection中的元素,collection本身必須聲明為mut
    let mut collection: Vec<i32> = vec![1, 2, 4, 6, 9];

    // 注意這兒item的類型是&mut i32,即它是對collection中元素的可變引用
    for item in &mut collection {
        // 通過*對可變引用進行解引用,從而可以修改引用指向的值
        *item = *item +1;
        println!("item:{}", item);
    }

    println!("collection after for loop:{:?}", collection);
}

上面的程序運行輸出:

item:2
item:3
item:5
item:7
item:10
collection after for loop:[2, 3, 5, 7, 10]

實現(xiàn)了對集合元素的修改。

因為rust會將for item in &mut collection替換成for item in collection.iter_mut():

fn main() {
    // 注意,為了修改collection中的元素,collection本身必須聲明為mut
    let mut collection: Vec<i32> = vec![1, 2, 4, 6, 9];

    // 注意這兒item的類型是&mut i32,即它是對collection中元素的可變引用
    for item in collection.iter_mut() { // 等價于for item in (&mut collection).iter_mut() {
        // 通過*對可變引用進行解引用,從而可以修改引用指向的值
        *item = *item +1;
        println!("item:{}", item);
    }

    println!("collection after for loop:{:?}", collection);
}

參考資料:
1.《Rust實戰(zhàn)》(Rust In Action)

到此這篇關(guān)于Rust for循環(huán)語法糖背后的API的文章就介紹到這了,更多相關(guān)Rust for循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust?搭建一個小程序運行環(huán)境的方法詳解

    Rust?搭建一個小程序運行環(huán)境的方法詳解

    rust是一門比較新的編程語言,2015年5月15日,Rust編程語言核心團隊正式宣布發(fā)布Rust?1.0版本,本文給大家介紹Rust?搭建一個小程序運行環(huán)境,以iOS?為例介紹開發(fā)環(huán)境的準(zhǔn)備,感興趣的朋友跟隨小編一起看看吧
    2022-05-05
  • Rust包和Crate超詳細(xì)講解

    Rust包和Crate超詳細(xì)講解

    這篇文章主要介紹了Rust包管理和Crate,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • C++的替代:微軟如何使用rust?

    C++的替代:微軟如何使用rust?

    這篇文章主要介紹了微軟如何使用rust的,幫助大家了解c++和rust這兩門編程語言的聯(lián)系與區(qū)別,感興趣的朋友可以了解下
    2020-09-09
  • rust引用和借用的使用小結(jié)

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

    在rust中,引用的語法非常簡單。通過&來取引用,通過*來解引用,這篇文章主要介紹了rust引用和借用的使用小結(jié),總的來說,借用規(guī)則,同一時刻,你只能擁有要么一個可變引用,?要么任意多個不可變引用,具體內(nèi)容詳情跟隨小編一起看看吧
    2023-01-01
  • RUST異步流處理方法詳細(xì)講解

    RUST異步流處理方法詳細(xì)講解

    這篇文章主要介紹了RUST異步流處理方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • Rust重載運算符之復(fù)數(shù)四則運算的實現(xiàn)

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

    這篇文章主要為大家詳細(xì)介紹了Rust如何實現(xiàn)復(fù)數(shù)以及復(fù)數(shù)的四則運算,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • Rust+React創(chuàng)建富文本編輯器

    Rust+React創(chuàng)建富文本編輯器

    這篇文章主要為大家介紹了Rust+React創(chuàng)建富文本編輯器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 在Rust中編寫自定義Error的詳細(xì)代碼

    在Rust中編寫自定義Error的詳細(xì)代碼

    Result<T, E> 類型可以方便地用于錯誤傳導(dǎo),Result<T, E>是模板類型,實例化后可以是各種類型,但 Rust 要求傳導(dǎo)的 Result 中的 E 是相同類型的,所以我們需要編寫自己的 Error 類型,本文給大家介紹了在Rust中編寫自定義Error的詳細(xì)代碼,需要的朋友可以參考下
    2024-01-01
  • Rust生成隨機數(shù)的項目實踐

    Rust生成隨機數(shù)的項目實踐

    Rust標(biāo)準(zhǔn)庫中并沒有隨機數(shù)生成器,常見的解決方案是使用rand包,本文主要介紹了Rust生成隨機數(shù)的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Rust使用kind進行異常處理(錯誤的分類與傳遞)

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

    Rust?有一套獨特的處理異常情況的機制,它并不像其它語言中的?try?機制那樣簡單,這篇文章主要介紹了Rust指南錯誤的分類與傳遞以及使用kind進行異常處理,需要的朋友可以參考下
    2022-09-09

最新評論