Rust語言入門教程(五) - 流控制語句

if 表達式

在Rust中, if語句的判斷條件不需要用( )括起來, 它會認為所有在if{之間的表達式就是判斷條件,例如:

if num == 5 {msg = "five";
}

判斷條件的表達式必須返回一個bool型的值, 因為Rust是一個不喜歡進行強制類型轉換的語言,絕大多數時候, Rust都不會對數據進行強制類型轉換,也就是說,下面的例子是一個錯誤的范例:

if 1 {msg = "five"
}

如果要進行多分支的條件判斷,可以使用else if (注意 elseif是分開的),最后也可以用else結尾, 例如:

if num == 5{msg = "five";
} else if num == 4 {msg = "four";
} else {msg = "other";
}

注意, if是一種表達式, 而不是語句。 語句不會返回值, 而表達式會返回值, 因此,上面的代碼可以改寫成這樣:

msg = if num == 5{"five"
} else if num == 4 {"four"
} else {"other"
};                // 注意, 這是一個賦值語句, 語句應以 ; 結尾

注意,在上面的例子中,每個判斷分支的結尾沒有, 因為這是一個尾部表達式, 用于給if表達式返回一個值;我們也不能使用return關鍵字, 而只能使用尾部表達式,因為return只能用于函數定義的代碼塊中,給函數返回結果;另外,每個判斷分支返回的值的數據類型必須相同, 否則Rust編譯器無法確定變量msg的數據類型; 在if表達式的最后有一個;, 因為整體來看, 這是一個賦值語句, 把if表達式的返回值賦值給了變量msg, 而Rust的語句應該以;結尾。

三元表達式?

Rust中沒有三元表達式的設計, 例如在C語言中, 三元表達式形如:

num = a ? b : c;

雖然這種寫法確實簡單快捷, 但是即便這種簡單的例子,其實也并不是特別易讀和一目了然。如果事情稍微變得復雜一些, 加上一些三元表達式的嵌套, 看起來就更加的令人困惑了,比如:

num = a ? x ? y : z : c;

在Rust中我們選擇拋棄三元表達式, 因為用if就已經能夠簡單的表達需求了, 比如:

num = if a {b} else {c};

即使存在一些嵌套也是比較簡單易讀的,

num = if a {if x {y} else {z}
} else {c
}

loop 循環

loop是無條件的循環, 與變量不可變的原因類似, Rust的這個設計的初衷, 也是考慮到編譯器如果確定一個循環式無條件執行的情況下, 可以做更多的優化,從而獲得更好的性能。

當然, 正如變量也需要改變,循環最終仍然是需要終結的。在Rust中,我們也使用break語句來跳出循環,例如:

loop {break;
}

但是如何跳出多層循環呢,比如:

loop {loop {loop {break;}}
}

默認情況下, 這只會跳出最內層的循環,如果我想跳出指定層級的循環應該怎么辦呢?Rust允許我們給循環打標簽,以便滿足我們提到的這種需求, 標簽的格式是'標簽名(以一個'開頭), 下面的例子展示了如何從讓break語句跳出指定的循環:

'bob: loop {loop {loop {break 'bob;}}
}

最外層的循環被打上了一個名為'bob的標簽, 而break 'bob語句告訴我們, 要跳出的正是這個'bob循環。與break的用法類型,continue語句通常用于跳過本次循環,進入到下一次循環, continue同樣可以指定一個標簽, 告訴代碼下一次循環的入口在哪里, 例如:

'bob: loop {loop {continue 'bob;}
}

while 循環

while循環的行為和loop基本一致, 只是每次進行循環前, 都會進行條件判斷, 當條件判斷表達式的返回值為true時, 才會繼續進行下一輪循環。 與if表達式的條件判斷一樣, 條件判斷表達式的返回值必須為bool型, Rust不會為其他類型的返回值進行強制類型轉換。格式如下:

while dizzy() {do_stuff()
}

用loop加上if, 也可以很容易的改寫while表達式:

loop {if !dizzy() {break}do_stuff()
}

不要覺得這樣做是不是因為我太無聊了,Rust中并沒有do while的設計, 用上面的改寫方法, 就可以輕松的實現do while的效果了:

loop {do_stuff()if !dizzy() {break}
}

for 循環

和大多數現代編程語言一樣, Rust中的for循環會遍歷一個可迭代對象中的每個值。復合數據類型和集合數據類型(collections)通常都會有一些方法來返回一個可迭代對象,用于for循環使用。

for num in [7, 8, 9].iter(){// do stuff with num
}

上面的例子中[7, 8, 9]這個數組調用了iter()函數來獲取了一個迭代器,iter()這個函數也是通用的獲取迭代器的方法。一些有序的數據類型的迭代器會有序的返回一組值, 但一些無序的數據類型的迭代器返回的值的順序就是隨機的了。

Rust的for循環中, 如果迭代器返回的是一組值, 那么for循環中也可以用一組變量來直接解構并接收返回的值,例如:

let a = [(1, 2), (3, 4)];
for (x, y) in a.iter() {// do stuff with x, y
}

還有一個常見的場景是在某個數字范圍內進行for循環, 指定數字范圍的格式是起始(閉)..結束(開)

for num in 0..50 {// do stuff with num 1 to 49
}

如果想要包含結束的數字, 那么可以用這種格式起始(閉)..=結束(閉)

for num in 0..=50 {// do stuff with num 1 to 50
}

小結

本章介紹了if條件判斷語句, 和幾種循環語句的格式和使用場景, 下一章將介紹Rust中比較重要的一種數據類型,String。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167255.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167255.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167255.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[C/C++]數據結構 循環隊列

前言: 隊列是一種具有先進先出特性的結構,但是當數據出隊列以后,前面的空間就無法再次利用了,循環隊列就可以解決這個問題 一:概念及結構: 1.循環隊列概念 循環隊列是一種線性數據結構,其操作表現基于 FIFO(先進先出)原則并且隊尾被連接在隊…

顛覆與創新:算法備案的雙重挑戰

隨著數字時代的迅猛發展,算法已經成為了企業創新和競爭的關鍵因素。然而,伴隨著算法的廣泛應用,數據隱私、法規合規等問題也愈發凸顯,給企業帶來了雙重挑戰。本文將深入探討這一話題,探討算法備案如何在顛覆與創新之間…

IDEA、PHPSTORM 在命令行中進行 PHP debug

然在終端執行控制器的方法php yii test/ab 即可看到觸發debug 調試

視頻剪輯技巧:多個視頻合并新篇章,高效視頻剪輯,創造無限可能

在數字媒體時代,視頻剪輯已經成為一項重要的技能。多個視頻合并是一種將多個視頻片段合并成一個完整視頻的技巧。這種技巧可以將不同的視頻片段組合在一起,制作出獨特且具有吸引力的視頻內容。現在一起操作下云炫AI智剪如何批量合并視頻的操作吧。 一、準…

友思特分享 | Neuro-T:零代碼自動深度學習訓練平臺

來源:友思特 智能感知 友思特分享 | Neuro-T:零代碼自動深度學習訓練平臺 歡迎關注虹科,為您提供最新資訊! 工業自動化、智能化浪潮涌進,視覺技術在其中扮演了至關重要的角色。在汽車、制造業、醫藥、芯片、食品等行業…

針對CSP-J/S的每日一練:Day 11

一、審題 題目描述 給定兩個大小分別為 m m m 和 n n n 的正序(從小到大)數組 n u m s 1 nums1 nums1 和 n u m s 2 nums2 nums2。請你找出并返回這兩個正序數組的中位數。 算法的時間復雜度應該為 O ( l o g ( m n ) ) O(log (mn)) O(log(mn)) 。…

初學vue3與ts:路由跳轉帶參數

index-router <!-- 路由跳轉 --> <template><div><div class"title-sub flex"><div>1、用router-link跳轉帶參數id1&#xff1a;</div><router-link to"./link?id1"><button>點我跳轉</button>&…

maven 將Jar包安裝到本地倉庫

window系統&#xff1a; 注意事項&#xff1a;在windows中&#xff0c;使用mvn指令將jar安裝到本地倉庫時&#xff0c;一定要將相關資源使用“"”包裹上&#xff0c;不然會報下面的錯&#xff1a; mvn install:install-file "-DfileD:\BaiduNetdiskDownload\qianzixi…

管道在Vue和Angular中的作用及React的替代方案

管道在Vue和Angular中的作用及React的替代方案 前言管道起源管道特點 前端中管道概念和作用概念作用 React關于管道的替代方案Vue和Angular管道的區別 前言 本文主要講解管道在Vue和Angular中有哪些作用以及React對于管道概念的替代方案是什么。 管道起源 計算機中的Pipline…

PHP5.3 + Apache2.2 + Xdebug2.1.2環境并集成至PHPStrom全流程(解決使用最好的語言前的痛點問題)

文章目錄 問題背景安裝流程PHP安裝配置PHPApache安裝及配置PHPStrom集成PHP環境進行PHP開發 問題背景 由于公司陳舊項目的重新啟動&#xff0c;現需要對該項目開發微信登錄模塊&#xff0c;本人是寫 Java 的&#xff0c;但本著程序員終身學習、不懼新事物的特點&#xff0c;現…

NX二次開發UF_CSYS_set_wcs_display 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_set_wcs_display Defined in: uf_csys.h int UF_CSYS_set_wcs_display(int display_status ) overview 概述 Set display of work coordinate system. 展示工作坐標系。 …

Android 11.0 默認開啟USB調試功能

Android 11.0 默認開啟USB調試功能 近來收到項目反饋需求想要默認開啟USB調試功能&#xff0c;默認開啟USB調試功能主要是在UsbDebuggingActivity.java文件中實現&#xff0c;具體修改參照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/and…

狀態模式 (State Pattern)

定義 狀態模式&#xff08;State Pattern&#xff09;是一種行為型設計模式&#xff0c;它允許一個對象在其內部狀態改變時改變它的行為。這種模式將每個狀態的行為封裝到對應的狀態類中&#xff0c;使得上下文&#xff08;Context&#xff09;的行為隨著其內部狀態的改變而改…

公眾號違禁詞及違規行為匯總

1、微信官方發布《微信公眾平臺關于清理集贊行為的公告》&#xff0c;全面禁止公眾賬號“集贊”玩法。 微信對違反微信用戶協議和公眾平臺協議的公眾號處理機制是&#xff0c;公眾號累計發現一次有集贊行為&#xff0c;封號7天&#xff1b;公眾號累計發現二次有集贊行為&#…

面試:ShardingSphere問題

文章目錄 什么是ShardingSphere&#xff0c;它的主要功能是什么&#xff1f;ShardingSphere的核心模塊有哪些&#xff1f;他們是如何工作的&#xff1f;ShardingSphere 的讀寫分離是如何實現的&#xff1f;如何配置ShardingSphere的數據分片策略&#xff1f;ShardingSphere支持…

【運維面試100問】(六)buffer和cache的區別

本站以分享各種運維經驗和運維所需要的技能為主 《python零基礎入門》&#xff1a;python零基礎入門學習 《python運維腳本》&#xff1a; python運維腳本實踐 《shell》&#xff1a;shell學習 《terraform》持續更新中&#xff1a;terraform_Aws學習零基礎入門到最佳實戰 《k8…

【Linux】匿名管道+進程池

文章目錄 前置知識一、管道的原理二、管道的特性三、管道的接口四、使用管道實現簡單的進程池解決進程池的一個小問題 前置知識 一個進程在創建時&#xff0c;會默認打開三個文件&#xff0c;分別是&#xff1a;stdin&#xff0c;stdout&#xff0c;stderr 進程中有一個維護進…

1linux

Is查看目錄內容 ls -ahil a表示全部&#xff0c;h表示文件大小以人類易讀的形式給出&#xff0c;i表示索引節點&#xff0c;l表示長列表形式。 cd 切換目錄 touch 創建文件 mkdir 創建目錄 mkdir Makedirectory&#xff0c;創建目錄&#xff0c;-p指定路徑&#xff0c;-m指定權…

炫我出席數字光影工作室專業建設論壇,受聘為專家委員會委員!

11月18日&#xff0c;炫我科技受邀參加在北京深瀾AI空間舉辦的2023數字光影工作室專業建設論壇。本次活動由北京市新媒體技師學院主辦、北京瀾景科技有限公司協辦&#xff0c;私有云售前技術工程師龔琛代表我司出席&#xff0c;并受聘為新媒體技師學院數字光影工作室專家委員會…

Mysql基礎操作(命令行)

文章目錄 Mysql基礎操作&#xff08;命令行&#xff09;背景創建數據庫選擇數據庫查看所有表查看表結構向表插入數據插入第一條插入第二條插入第三條 查詢表數據修改表數據刪除表數據 Mysql基礎操作&#xff08;命令行&#xff09; 背景 docker安裝mysql8&#xff0c;映射本地…