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

詳解Rust中三種循環(huán)(loop,while,for)的使用

 更新時(shí)間:2022年09月29日 14:53:44   作者:古明地覺(jué)  
我們常常需要重復(fù)執(zhí)行同一段代碼,針對(duì)這種場(chǎng)景,Rust?提供了多種循環(huán)(loop)工具。一個(gè)循環(huán)會(huì)執(zhí)行循環(huán)體中的代碼直到結(jié)尾,并緊接著回到開(kāi)頭繼續(xù)執(zhí)行。而?Rust?提供了?3?種循環(huán):loop、while?和?for,下面逐一講解

楔子

我們常常需要重復(fù)執(zhí)行同一段代碼,針對(duì)這種場(chǎng)景,Rust 提供了多種循環(huán)(loop)工具。一個(gè)循環(huán)會(huì)執(zhí)行循環(huán)體中的代碼直到結(jié)尾,并緊接著回到開(kāi)頭繼續(xù)執(zhí)行。

而 Rust 提供了 3 種循環(huán):loop、while 和 for,下面逐一講解。

loop 循環(huán)

我們可以使用 loop 關(guān)鍵字來(lái)指示 Rust 反復(fù)執(zhí)行某一段代碼,直到我們顯式地聲明退出為止。

fn?main()?{
????loop?{
????????println!("hello?world");
????}
}

這段代碼會(huì)不停地在終端中打印 hello world,我們只能使用 Ctrl + C 來(lái)終止這種陷入無(wú)限循環(huán)的程序。當(dāng)然,Rust 提供了另外一種更加可靠的循環(huán)退出方式,可以在循環(huán)中使用 break 關(guān)鍵字來(lái)通知程序退出循環(huán)。

fn?main()?{
????let?mut?x?=?1;??//?x?可變
????loop?{
????????println!("hello?world");
????????if?x?==?5?{
????????????break;
????????}
????????//?注意?x?必須是可變的
????????//?否則此處報(bào)錯(cuò)
????????x?+=?1;
????}
????/*
????hello?world
????hello?world
????hello?world
????hello?world
????hello?world
?????*/
}

打印了五遍就停止了,沒(méi)什么好說(shuō)的。但 loop 循環(huán)還支持返回值,我們舉個(gè)例子:

fn?main()?{
????let?mut?x?=?1;
????let?y?=?loop?{
????????if?x?==?5?{
????????????//?break?之后的值就是整個(gè)?loop?的返回值
????????????break?x?*?2;
????????}
????????x?+=?1;
????};
????println!("y?=?{}",?y);??//?y?=?10
}

如果 break 后面沒(méi)有值,那么整個(gè) loop 返回的就是空元組:

fn?main()?{
????let?mut?x?=?1;
????let?y?=?loop?{
????????if?x?==?5?{
????????????break;
????????}
????????x?+=?1;
????};
????println!("y?=?{:?}",?y);??//?y?=?()
}

需要說(shuō)明的是,無(wú)論 break 后面有沒(méi)有分號(hào),它都是整個(gè) loop 循環(huán)的返回值。

既然是 loop 循環(huán)是一個(gè)表達(dá)式,那么除了賦值給一個(gè)變量之外,肯定也可以作為函數(shù)的返回值:

fn?f()?->?i32?{
????let?mut?x?=?1;
????loop?{
????????if?x?==?5?{
????????????break?x?*?2;
????????}
????????x?+=?1;
????}?//?此處結(jié)尾不可以有分號(hào)
}

fn?main()?{
????println!("{}",?f());??//?10
}

注意 loop 循環(huán)的最后一定不能加分號(hào),因?yàn)榧恿司蜁?huì)變成語(yǔ)句,而語(yǔ)句不會(huì)返回任何內(nèi)容。所以在 if 表達(dá)式的時(shí)候我們啰嗦了那么多關(guān)于表達(dá)式、分號(hào)的內(nèi)容,就是因?yàn)檫@些概念在循環(huán)中同樣會(huì)體現(xiàn)。

下面的做法是錯(cuò)誤的:

fn?f()?->?i32?{
????let?mut?x?=?1;
????loop?{
????????if?x?==?5?{
????????????break?x?*?2;
????????}
????????x?+=?1;
????};??//?這里加上了分號(hào)
}

我們一定不能這么做,因?yàn)檫@會(huì)讓 loop 循環(huán)變成語(yǔ)句,而下面又沒(méi)有內(nèi)容了,因此函數(shù) f 會(huì)默認(rèn)返回空元組。而函數(shù)的返回值簽名是 i32,于是出現(xiàn)矛盾,造成編譯錯(cuò)誤。那么下面這個(gè)例子可以嗎?

fn?f()?->?i32?{
????let?mut?x?=?1;
????loop?{
????????if?x?==?5?{
????????????//?break?語(yǔ)句結(jié)尾有沒(méi)有分號(hào)
????????????//?并不重要
????????????break?x?*?2;
????????}
????????x?+=?1;
????}
????33
}

答案是依舊不行,因?yàn)?loop 循環(huán)是一個(gè)表達(dá)式,而它下面還有表達(dá)式,違反了我們之前說(shuō)的函數(shù)末尾只能有一個(gè)表達(dá)式的原則。但是有一個(gè)例外,相信你已經(jīng)猜到了,就是當(dāng) loop 表達(dá)式返回元組的時(shí)候,那么會(huì)忽略掉。

fn?f()?->?i32?{
????let?mut?x?=?1;
????loop?{
????????if?x?==?5?{
????????????//?等價(jià)于?break;
????????????break?();??
????????}
????????x?+=?1;
????}
????33
}

此時(shí)是沒(méi)有問(wèn)題的,以上就是 loop 循環(huán)。

while 循環(huán)

另外一種常見(jiàn)的循環(huán)模式是在每次執(zhí)行循環(huán)體之前都判斷一次條件,如果條件為真,則執(zhí)行代碼片段,如果條件為假、或在執(zhí)行過(guò)程中碰到 break 就退出當(dāng)前循環(huán)。

這種模式可以通過(guò) loop、if、else 及 break 關(guān)鍵字的組合使用來(lái)實(shí)現(xiàn),有興趣的話可以試著完成這一功能。不過(guò)由于這種模式太過(guò)于常見(jiàn),所以 Rust 為此提供了一個(gè)內(nèi)置的語(yǔ)言結(jié)構(gòu):while 條件循環(huán)。

fn?main()?{
????let?mut?x?=?1;
????while?x?<=?5?{
????????println!("hello?world");
????????x?+=?1;
????}
}

執(zhí)行完之后會(huì)打印 5 次 hello world,然后是返回值的問(wèn)題,while 循環(huán)不可以像 loop 一樣 break 一個(gè)值,也就是說(shuō)它只能默認(rèn)返回空元組。

fn?f()?->?i32?{
????let?mut?x?=?1;
????while?x?<=?5?{
????????if?x?==?3?{
????????????break;
????????}
????????x?+=?1
????}
????//?沒(méi)有下面這個(gè)?33,那么該函數(shù)就是非法的
????33
}

fn?main()?{
????println!("{:?}",?f());??//?33

????//?當(dāng)然?while?循環(huán)也可以賦值給一個(gè)變量
????//?因?yàn)橹豢赡芊祷乜赵M,所以這么做沒(méi)有什么意義
????let?x?=?while?1?<=?2?{
????????break;
????};
????println!("{:?}",?x);??//?()
}

而當(dāng) break 后面有值的時(shí)候,會(huì)編譯錯(cuò)誤,假設(shè)我們 break 123。

告訴我們帶有值的 break 只能出現(xiàn)在 loop 循環(huán)中,而 while 循環(huán)是不支持的。另外即便 break 一個(gè)空元組也是不允許的,盡管 while 循環(huán)會(huì)默認(rèn)返回空元組。

for 循環(huán)

我們遍歷一個(gè)數(shù)組可以選擇 loop 循環(huán)、while 循環(huán),但是這樣容易因?yàn)槭褂昧瞬徽_的索引長(zhǎng)度而使程序崩潰。

fn?traverse1()?{
????let?arr?=?[1,?2,?3,?4,?5];
????let?mut?sum:?i32?=?0;
????let?mut?index:?usize?=?0;
????loop?{
????????if?index?<?5?{
????????????//?通過(guò)索引獲取元素
????????????//?索引必須是?usize?類型
????????????sum?+=?arr[index];
????????}?else?{
????????????break;
????????}
????????index?+=?1;
????}
????println!("sum([1,?2,?3,?4,?5])?=?{}",?sum);
}

fn?traverse2()?{
????let?arr?=?[1,?2,?3,?4,?5];
????let?mut?sum:?i32?=?0;
????let?mut?index:?usize?=?0;
????while?index?<?5?{
????????sum?+=?arr[index];
????????index?+=?1;
????}
????println!("sum([1,?2,?3,?4,?5])?=?{}",?sum);
}

fn?main()?{
????traverse1();??
????//?sum([1,?2,?3,?4,?5])?=?15
????traverse2();??
????//?sum([1,?2,?3,?4,?5])?=?15
}

雖然成功遍歷了,但如果索引越界的話就會(huì)發(fā)生錯(cuò)誤,因此可以使用 for 循環(huán)這種更簡(jiǎn)明的方法來(lái)遍歷集合中的每一個(gè)元素。

fn?traverse()?{
????let?arr?=?[1,?2,?3,?4,?5];
????let?mut?sum:?i32?=?0;
????for?element?in?arr?{
????????sum?+=?element;
????}
????println!("sum([1,?2,?3,?4,?5])?=?{}",?sum);
}

fn?main()?{
????traverse();??
????//?sum([1,?2,?3,?4,?5])?=?15
}

結(jié)果是一樣的,但我們?cè)鰪?qiáng)了代碼的安全性,不會(huì)出現(xiàn)諸如越界訪問(wèn)或漏掉某些元素之類的問(wèn)題。

假如后期修改代碼,我們從 arr 數(shù)組中移除了某個(gè)元素,卻忘記將循環(huán)中的條件更新為 while index < 4,那么再次運(yùn)行代碼就會(huì)發(fā)生崩潰。而使用 for 循環(huán)的話,就不需要時(shí)常惦記著在更新數(shù)組元素?cái)?shù)量時(shí),還要去修改代碼的其他部分。

for 循環(huán)的安全性和簡(jiǎn)捷性使它成為了 Rust 中最為常用的循環(huán)結(jié)構(gòu),即便是為了實(shí)現(xiàn)循環(huán)特定次數(shù)的任務(wù),大部分的 Rust 開(kāi)發(fā)者也會(huì)選擇使用 for 循環(huán)。我們可以配合標(biāo)準(zhǔn)庫(kù)中提供的 Range 來(lái)實(shí)現(xiàn)這一目的,它被用來(lái)生成從一個(gè)數(shù)字開(kāi)始到另一個(gè)數(shù)字結(jié)束之前的所有數(shù)字序列。

fn?main()?{
????for?number?in?1..4?{
????????println!("number?=?{}",?number);
????}
????/*
????number?=?1
????number?=?2
????number?=?3
?????*/

????//?還可以逆序輸出
????for?number?in?(1..4).rev()?{
????????println!("number?=?{}",?number);
????}
????/*
????number?=?3
????number?=?2
????number?=?1
?????*/
}

代碼是不是更加精煉了呢。

到此這篇關(guān)于詳解Rust中三種循環(huán)(loop,while,for)的使用的文章就介紹到這了,更多相關(guān)Rust循環(huán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Tauri?打開(kāi)本地文件踩坑分析解決

    Tauri?打開(kāi)本地文件踩坑分析解決

    這篇文章主要為大家介紹了Tauri?打開(kāi)本地文件踩坑分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Rust?HashMap詳解及單詞統(tǒng)計(jì)示例用法詳解

    Rust?HashMap詳解及單詞統(tǒng)計(jì)示例用法詳解

    HashMap在Rust中是一個(gè)強(qiáng)大的工具,通過(guò)合理使用可以簡(jiǎn)化很多與鍵值對(duì)相關(guān)的問(wèn)題,在實(shí)際開(kāi)發(fā)中,我們可以充分利用其特性,提高代碼的效率和可讀性,本文將深入介紹HashMap的特性,以及通過(guò)一個(gè)單詞統(tǒng)計(jì)的例子展示其用法,感興趣的朋友一起看看吧
    2024-02-02
  • C和Java沒(méi)那么香了,Serverless時(shí)代Rust即將稱王?

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

    Serverless Computing,即”無(wú)服務(wù)器計(jì)算”,其實(shí)這一概念在剛剛提出的時(shí)候并沒(méi)有獲得太多的關(guān)注,直到2014年AWS Lambda這一里程碑式的產(chǎn)品出現(xiàn)。Serverless算是正式走進(jìn)了云計(jì)算的舞臺(tái)
    2021-06-06
  • 深入探究在Rust中函數(shù)、方法和關(guān)聯(lián)函數(shù)有什么區(qū)別

    深入探究在Rust中函數(shù)、方法和關(guān)聯(lián)函數(shù)有什么區(qū)別

    在 Rust 中,函數(shù)、方法和關(guān)聯(lián)函數(shù)都是用來(lái)封裝行為的,它們之間的區(qū)別主要在于它們的定義和調(diào)用方式,本文將通過(guò)一個(gè)簡(jiǎn)單的rust代碼示例來(lái)給大家講講Rust中函數(shù)、方法和關(guān)聯(lián)函數(shù)區(qū)別,需要的朋友可以參考下
    2023-08-08
  • Rust實(shí)現(xiàn)一個(gè)表達(dá)式Parser小結(jié)

    Rust實(shí)現(xiàn)一個(gè)表達(dá)式Parser小結(jié)

    這篇文章主要為大家介紹了Rust實(shí)現(xiàn)一個(gè)表達(dá)式Parser小結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Rust中的模塊系統(tǒng)之控制作用域與私有性詳解

    Rust中的模塊系統(tǒng)之控制作用域與私有性詳解

    這篇文章總結(jié)了Rust模塊系統(tǒng)的基本規(guī)則,包括如何聲明模塊、路徑訪問(wèn)、私有性與公開(kāi)性,以及如何使用`use`關(guān)鍵字簡(jiǎn)化路徑引用,通過(guò)一個(gè)餐廳系統(tǒng)示例,展示了如何利用模塊劃分功能,并介紹了如何在其他模塊或二進(jìn)制crate中使用這些模塊
    2025-02-02
  • Rust中的Trait與Trait Bounds詳解

    Rust中的Trait與Trait Bounds詳解

    Rust中的Trait與TraitBounds通過(guò)《西游記》的故事背景進(jìn)行解釋,Trait是一種接口定義機(jī)制,用于描述角色的能力;TraitBounds用于限制函數(shù)或結(jié)構(gòu)體的參數(shù)類型必須實(shí)現(xiàn)某些trait;BlanketImplementations可以為所有實(shí)現(xiàn)了某類trait的類型提供默認(rèn)的trait實(shí)現(xiàn)
    2025-02-02
  • Rust控制流運(yùn)算符match的用法詳解

    Rust控制流運(yùn)算符match的用法詳解

    match 是Rust中一個(gè)極為強(qiáng)大的控制流運(yùn)算符,用于模式匹配和控制流的選擇,它允許將一個(gè)值與一系列的模式相比較,根據(jù)匹配的模式執(zhí)行相應(yīng)代碼,本文給大家詳細(xì)介紹了Rust控制流運(yùn)算符match的用法,需要的朋友可以參考下
    2024-01-01
  • 通過(guò)rust實(shí)現(xiàn)自己的web登錄圖片驗(yàn)證碼功能

    通過(guò)rust實(shí)現(xiàn)自己的web登錄圖片驗(yàn)證碼功能

    本文介紹了如何使用Rust和imagecrate庫(kù)生成圖像驗(yàn)證碼,首先,通過(guò)Cargo.toml文件添加image依賴,然后,生成純色圖片并編輯驗(yàn)證圖片,接著,編寫隨機(jī)函數(shù)獲取字符,并通過(guò)循環(huán)生成驗(yàn)證碼圖片,最終,通過(guò)運(yùn)行函數(shù)驗(yàn)證驗(yàn)證碼圖片是否生成,感興趣的朋友一起看看吧
    2025-03-03
  • RUST語(yǔ)言函數(shù)的定義與調(diào)用方法

    RUST語(yǔ)言函數(shù)的定義與調(diào)用方法

    定義一個(gè)RUST函數(shù)使用fn關(guān)鍵字,下面通過(guò)本文給大家介紹RUST語(yǔ)言函數(shù)的定義與調(diào)用方法,感興趣的朋友跟隨小編一起看看吧
    2024-04-04

最新評(píng)論

德阳市| 高要市| 陵川县| 贡山| 天柱县| 房山区| 扶风县| 简阳市| 西华县| 绥滨县| 正镶白旗| 星子县| 桦甸市| 鲁甸县| 维西| 黄梅县| 乌兰察布市| 太康县| 额尔古纳市| 胶南市| 同江市| 福泉市| 沈丘县| 宜丰县| 鹤壁市| 多伦县| 嵊泗县| 九龙坡区| 高碑店市| 莱州市| 青河县| 孟州市| 大冶市| 镇安县| 兰西县| 亳州市| 桂林市| 高台县| 玛沁县| 阿图什市| 澎湖县|