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

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

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

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

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

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

形式如:for item in collection(集合或容器類型)會(huì)拿走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,因?yàn)閏ollection的所有權(quán)已經(jīng)被拿走,且在for循環(huán)后collection已經(jīng)被drop掉了
    // println!("collection:{:?}", collection);
}

因?yàn)閞ust編譯器會(huì)將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_開頭的方法一般情況下都會(huì)拿走參數(shù)的所有權(quán)
    let iter = IntoIterator::into_iter(collection);
    // 從這兒開始,collection已經(jīng)不能再被使用,因?yàn)閏ollection的所有權(quán)被轉(zhuǎn)移到into_iter方法中,當(dāng)方法執(zhí)行完,collection就被drop掉了 
    // println!("collection:{:?}", collection); // 如果這兒使用collection就會(huì)編譯報(bào)錯(cuò)
    for item in iter{
        println!("item:{}", item);
    }
}

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

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

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

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

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

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

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

因?yàn)閞ust會(huì)將for item in &collection替換成for item in collection.iter():

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

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

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

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

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

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

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

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

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

上面的程序運(yùn)行輸出:

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

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

因?yàn)閞ust會(huì)將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,即它是對(duì)collection中元素的可變引用
    for item in collection.iter_mut() { // 等價(jià)于for item in (&mut collection).iter_mut() {
        // 通過(guò)*對(duì)可變引用進(jìn)行解引用,從而可以修改引用指向的值
        *item = *item +1;
        println!("item:{}", item);
    }

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

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

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

相關(guān)文章

  • 使用Rust語(yǔ)言管理Node.js版本

    使用Rust語(yǔ)言管理Node.js版本

    這篇文章主要介紹一個(gè)使用?Rust?進(jìn)行編寫的一體化版本管理工具?Rtx,比如使用它來(lái)管理?Node.js?版本,它很簡(jiǎn)單易用,使用了它,就可以拋棄掉?nvm?了,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Rust語(yǔ)言之Copy和Clone詳解

    Rust語(yǔ)言之Copy和Clone詳解

    在 Rust 中,Copy 和 Clone trait 用于控制類型的復(fù)制行為。它們?cè)试S你定義如何復(fù)制類型的值,以及在什么情況下可以復(fù)制。本文將詳細(xì)介紹這兩個(gè) trait 的作用和用法,并通過(guò)代碼示例來(lái)展示它們的使用,需要的朋友可以參考下
    2023-05-05
  • Rust使用libloader調(diào)用動(dòng)態(tài)鏈接庫(kù)

    Rust使用libloader調(diào)用動(dòng)態(tài)鏈接庫(kù)

    這篇文章主要為大家介紹了Rust使用libloader調(diào)用動(dòng)態(tài)鏈接庫(kù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 淺談Rust?+=?運(yùn)算符與?MIR?應(yīng)用

    淺談Rust?+=?運(yùn)算符與?MIR?應(yīng)用

    這篇文章主要介紹了Rust?+=?運(yùn)算符與?MIR?應(yīng)用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Rust語(yǔ)言中級(jí)教程之指針

    Rust語(yǔ)言中級(jí)教程之指針

    Rust中共有三種類型的指針,分別為引用,解引用,智能指針,這篇文章主要介紹了Rust語(yǔ)言中級(jí)教程之指針,需要的朋友可以參考下
    2023-05-05
  • 從迷你todo?命令行入門Rust示例詳解

    從迷你todo?命令行入門Rust示例詳解

    這篇文章主要為大家介紹了從一個(gè)迷你todo命令行入門Rust的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • libbpf和Rust開發(fā)ebpf程序?qū)崙?zhàn)示例

    libbpf和Rust開發(fā)ebpf程序?qū)崙?zhàn)示例

    這篇文章主要為大家介紹了libbpf和Rust開發(fā)ebpf程序?qū)崙?zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • MacBook Pro安裝rust編程環(huán)境的過(guò)程

    MacBook Pro安裝rust編程環(huán)境的過(guò)程

    rustup是一個(gè)用于管理Rust版本和工具鏈的工具,這篇文章主要介紹了MacBook Pro安裝rust編程環(huán)境的過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • 在Rust中要用Struct和Enum組織數(shù)據(jù)的原因解析

    在Rust中要用Struct和Enum組織數(shù)據(jù)的原因解析

    在Rust中,Struct和Enum是組織數(shù)據(jù)的核心工具,Struct用于將相關(guān)字段封裝為單一實(shí)體,便于管理和擴(kuò)展,Enum用于明確定義所有可能的狀態(tài),本文將通過(guò)具體示例,深入探討為什么在Rust中必須使用struct和enum來(lái)管理數(shù)據(jù),感興趣的朋友一起學(xué)習(xí)吧
    2025-02-02
  • Rust?編程語(yǔ)言中的所有權(quán)ownership詳解

    Rust?編程語(yǔ)言中的所有權(quán)ownership詳解

    這篇文章主要介紹了Rust?編程語(yǔ)言中的所有權(quán)ownership詳解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評(píng)論

叶城县| 张家界市| 桃源县| 抚州市| 邻水| 瑞丽市| 比如县| 伊宁县| 河北省| 嘉兴市| 建湖县| 驻马店市| 武穴市| 石台县| 明水县| 射阳县| 革吉县| 双桥区| 滁州市| 兴安盟| 石棉县| 阳泉市| 延长县| 鲁山县| 鄂尔多斯市| 安福县| 航空| 临夏县| 三穗县| 三门县| 社会| 龙门县| 顺义区| 凌源市| 海阳市| 昭苏县| 安新县| 衡山县| 新津县| 宣威市| 措美县|