国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

果然,連流程控制都這么另類

開發(fā) 前端
這是 Rust 勸退系列的第 7 個教程,探討 Rust 中的流程控制。注意,跟其他語言一樣,Rust 中有條件、循環(huán),但沒有 switch,而是有 match 模式匹配。

[[401800]]

本文轉(zhuǎn)載自微信公眾號「polarisxu」,作者站長polaris。轉(zhuǎn)載本文請聯(lián)系polarisxu公眾號。

大家好,我是 polarisxu。

這是 Rust 勸退系列的第 7 個教程,探討 Rust 中的流程控制。注意,跟其他語言一樣,Rust 中有條件、循環(huán),但沒有 switch,而是有 match 模式匹配。

這個系列常規(guī)的標(biāo)題閱讀量實在有點看不下去,所以試試其他標(biāo)題。

01 運算符

開始講解流程控制之前,先補(bǔ)充一個知識點,那就是 Rust 的運算符。

Rust 支持算術(shù)運算符、關(guān)系運算符、邏輯運算符和位運算符 4 種,它們和其他語言沒有什么不同,因此不細(xì)講了,只提醒一點:Rust 中沒有自增(++)和自減運算符(--)。

  • Go 中 ++ 或 -- 是語句,只有一種形式:后綴,即 i++;而 C 等語言支持前綴和后綴,如 i++、++i。Rust 干脆全沒有。

吐槽:自增和自減運算符,有時候挺好用的,Rust 為啥不支持呢?!(難道因為沒有常規(guī)的 for 循環(huán),所以不需要?)

02 語句和表達(dá)式

為什么專門介紹語句和表達(dá)式?!

上文提到,Go 中的自增或自減是語句而不是表達(dá)式,這有什么不同呢?

很多語言對語句和表達(dá)式基本不會特意區(qū)分、強(qiáng)調(diào),所以很多人也不會在意這兩者有什么不同。但在 Rust 中,還是很有必要區(qū)分它們的。

實際上,Rust 中的語法可以分為兩大類:語句(Statement)和表達(dá)式(Expression)。語句是指要執(zhí)行的一些操作和產(chǎn)生副作用的表達(dá)式;而表達(dá)式主要用于計算求值。

語句通常分為聲明語句和表達(dá)式語句。像聲明各種語言項,如變量、常量、結(jié)構(gòu)體、函數(shù)等,都是聲明語句:

  1. let a = 1; 
  2. const PI: i32 = 3.14; 

而表達(dá)式語句,指的是以分號結(jié)尾的表達(dá)式,一般會涉及到將多個表達(dá)式組合為語句。

《Rust 編程之道》上說,Rust 中的表達(dá)式一般分為「位置表達(dá)式」和「值表達(dá)式」,概念太多,容易勸退,直接按照其他語言的叫法:左值和右值。

之所以都用表達(dá)式的說法,是因為 Rust 中一切皆表達(dá)式。

羅里吧嗦講一堆,似乎沒啥用。知道有這么回事即可。只需要記住 Rust 中一切皆表達(dá)式即可。

03 條件表達(dá)式

知道為什么要強(qiáng)調(diào)「表達(dá)式」了嗎?一般語言中都叫:條件語句,但 Rust 中卻是條件表達(dá)式。

首先,條件表達(dá)式的語法和其他語言的條件語句類似,支持 if、else if、else 等,但它和 Go 中類似,條件默認(rèn)都不需要括號。但因為是表達(dá)式,所以它有返回值,而 Rust 是強(qiáng)類型語言,因此返回值的類型必須確定。比如以下代碼是能正常編譯的:

  1. fn testif() -> &'static str { 
  2.     let name = "polarisxu"
  3.     if name == "polarisxu" { 
  4.         "Welcome" 
  5.     } else { 
  6.         "Forbidden" 
  7.     } 

看不懂沒關(guān)系。我們只關(guān)注 if-else 部分。

在塊表達(dá)式里(由 {} 包圍),直接一個字符串字面值(這是值表達(dá)式),連分號都沒有。Rust 沒有分號和 Go 中的沒有分號意義是不一樣的。

  • Go 語句以分號結(jié)尾,分號推薦不寫,編譯器會自動補(bǔ)上;
  • Rust 語句必須手動加分號,如果不加分號,那是一個表達(dá)式。

一切皆表達(dá)式,大括號包圍起來的是塊表達(dá)式,那塊表達(dá)式的值是什么?它的值是里面一系列表達(dá)式中最后一個表達(dá)式的值。

所以,上面的代碼,無論是執(zhí)行到 if 還是 else,整個 if 表達(dá)式的值的類型是字符串。所以,以上代碼可以改為這樣:

  1. fn testif() -> &'static str { 
  2.     let name = "polarisxu"
  3.     let result = if name == "polarisxu" { 
  4.         "Welcome" 
  5.     } else { 
  6.         "Forbidden" 
  7.     }; 
  8.  
  9.     hello 

我們將 if 表達(dá)式的結(jié)果保存在 result 變量中,注意 if 表達(dá)式大括號最后的分號,這種情況,分號不能省略。

因此,在 if 表達(dá)式中,各個分支表達(dá)式最終的結(jié)果類型必須一致,否則編譯不通過。這也是為什么 Rust 不支持三元操作符 ?: 的原因。

if 是表達(dá)式有它的好處。在 Go 語言中,經(jīng)常會寫類似這樣的代碼:

  1. var result string 
  2. if name == "polarisxu" { 
  3.   result = "Welcome" 
  4. else { 
  5.   result = "Forbidden" 

而 Rust 的代碼,result 少寫了很多次。但需要注意各分支結(jié)果類型的一致性。

if 表達(dá)式可以這么用,其他流程控制表達(dá)式也可以這么用。

特別說明一點。如果塊表達(dá)式的最后一個表達(dá)式是語句,比如:

  1. fn testif() -> &'static str { 
  2.     let name = "polarisxu"
  3.     if name == "polarisxu" { 
  4.         "Welcome"
  5.     } else { 
  6.         "forbidden"
  7.     } 

這時編譯會報錯:mismatched types。

因為函數(shù)要求返回值類型是 &str,而函數(shù)體最后返回的類型是空。這個空,在其他語言中一般是沒有返回值,或者是 void。但在 Rust 中,這個空是前面介紹類型時介紹過的「unit」類型,即 (),該類型有唯一的值,也是 ()。

所以,我們可以去掉函數(shù)的返回值,或者返回 ():

  1. fn testif() -> () { 
  2.     let name = "polarisxu"
  3.     if name == "polarisxu" { 
  4.         "Welcome"
  5.     } else { 
  6.         "forbidden"
  7.     } 

很另類,有木有?!

04 循環(huán)表達(dá)式

Rust 中包含三種循環(huán)表達(dá)式:while、loop 和 for…in。其用法和其他編程語言相應(yīng)的語句類似。(注意,Go 中只有 for 一種循環(huán)語句)

loop 循環(huán)比較特殊,一般語言中沒有,它其實就是 while true {},相當(dāng)于 Go 中的 for {}。不得不說,還是 Go 簡單呀!

而 while 循環(huán),相當(dāng)于 Go 中的 for condition {},condition 為 true 時,執(zhí)行循環(huán)體。

你發(fā)現(xiàn)沒,循環(huán)搞這么復(fù)雜,竟然沒有其他語言中普通的 for 循環(huán)?因為 for…in 可以搞定。

比如 Go 中的 for i := 0; i < 10; i++,在 Rust 中是這樣的:for i in 0..10 {}。來個簡單的例子,從 1 加到 100:

  1. let mut sum = 0; 
  2. for i in 1..=100 { 
  3.   sum += i; 
  4. println!("1+2+..+100={}"sum); 

小細(xì)節(jié):1..10 表示范圍 [1, 10),而 1..=10 表示范圍 [1, 10]

最后,和其他語言一樣,循環(huán)支持 continue 和 break 語句。

05 小結(jié)

Rust 中一切皆表達(dá)式,當(dāng)某個地方需要一個表達(dá)式,但卻是一個語句時,編譯器會自動補(bǔ)上單元值,即 (),這算是一個特殊的表達(dá)式。

雖然控制結(jié)構(gòu),if、循環(huán)等都是表達(dá)式,為了不搞特殊化(畢竟大家習(xí)慣很多其他語言,特殊化可能容易把自己搞迷糊),建議大家盡量別把它們當(dāng)表達(dá)式看待,很其他語言一樣正常寫,該有分號的加分號。

不過,如果是 Go 程序員寫 Rust,很可能忘記分號。而 Rust 中,有時候有分號和沒有分號都能編譯,但意思可能變了,這個要特別注意。(PHPer 表示,經(jīng)常在 PHP 和 Go 之間切換時,分號的問題很糾結(jié),有木有?!)

 

控制流程中的模式匹配,下節(jié)再講!

 

責(zé)任編輯:武曉燕 來源: polarisxu
相關(guān)推薦

2017-05-31 17:09:52

LinuxShell命令

2024-06-06 09:09:41

SQL循環(huán)控制命令

2010-05-11 12:53:58

Unix awk

2009-12-15 09:56:51

Ruby流程控制

2009-09-04 10:42:56

C#流程控制語句

2024-11-01 16:05:26

2025-07-01 08:20:00

JUC包Java并發(fā)

2010-07-19 10:11:58

Perl流程控制語句

2024-11-05 12:59:42

while 循環(huán)迭代字節(jié)碼

2013-12-13 15:48:52

Lua腳本語言

2021-08-05 06:54:05

流程控制default

2011-09-08 13:53:31

Node.js

2015-07-23 15:17:37

JavaScript循環(huán)語句

2011-08-24 16:36:00

T-SQL

2010-03-18 16:37:13

Python 程序流程

2023-06-02 07:30:24

If-else結(jié)構(gòu)流程控制

2010-11-04 10:55:16

DB2流程控制

2022-07-27 08:31:28

SQL開發(fā)控制

2021-05-27 09:30:51

Java流程控制

2010-05-11 12:17:51

Unix awk
點贊
收藏

51CTO技術(shù)棧公眾號

日韩一级视频| 欧美xxxx中国| 欧美视频在线一区| 黄页免费在线| 亚洲一区二区三区视频在线播放| 国产中文字幕视频在线观看| 免费观看在线综合| 亚洲五月六月| 国产精品中文有码| 国产日韩亚洲欧美在线| 国产成人午夜99999| 中文字幕在线亚洲精品| 蜜桃精品视频在线观看| 资源网第一页久久久| 另类小说综合欧美亚洲| 午夜老司机精品| 国产在线精品免费av| 乱熟女高潮一区二区在线| 日韩精品视频中文在线观看| 在线观看涩涩| 最近2019年中文视频免费在线观看| 先锋欧美三级| 九九九久久久久久| a看欧美黄色女同性恋| 亲子乱一区二区三区电影| 欧美最新另类人妖| 91美女片黄在线观| 亚洲在线国产日韩欧美| 中文字幕免费高| 国产欧美一二三区| 黄动漫网站在线观看| 欧美丝袜丝交足nylons图片| caoporn97在线视频| 国产视频精品一区二区三区| 成人精品视频在线观看| 国产精品吹潮在线观看| 99riav国产精品| 最近看过的日韩成人| 久久婷婷一区二区三区| 922tv免费观看在线| 欧美视频在线播放| 俄罗斯一级**毛片在线播放| 在线观看欧美视频| 牲欧美videos精品| 国产欧美日韩伦理| 成人精品gif动图一区| 二个人看的毛片| 555夜色666亚洲国产免| 日韩高清成人| 国产91久久婷婷一区二区| 国产精品社区| 你真棒插曲来救救我在线观看| 亚洲人亚洲人成电影网站色| 日韩精品黄色| 欧美另类第一页| 欧美精品午夜| 国产深夜男女无套内射| 动漫精品一区二区| 成人在线免费电影网站| 国产日韩av在线播放| 狠狠色综合日日| 国产区视频在线观看| 欧美一区二区三区在线电影| av日韩一区| 国产精品国产一区二区| 93久久精品日日躁夜夜躁欧美| 佐山爱痴汉视频一区二区三区 | av午夜精品一区二区三区| 国产免播放器视频| 亚洲美女精品久久| 亚欧美无遮挡hd高清在线视频| 99久热在线精品视频| 一区二区三区欧美久久| 一根才成人网| 97人人模人人爽视频一区二区| 波多野结衣一区二区三区 | 亚洲欧美日本韩国| 小h片在线观看| 91嫩草免费看| 国产午夜精品在线观看| 曰本三级在线| 国产日本欧美在线观看 | 成人在线视频中文字幕| 久久天堂国产精品| 樱桃国产成人精品视频| 性高爱久久久久久久久| 国产精品久久精品视| 中文字幕中文在线不卡住| 女厕盗摄一区二区三区| 风间由美一区二区三区| 1024成人网| 99精品国产九九国产精品| 日本一区二区高清视频| 色婷婷一区二区| 亚洲日产av中文字幕| 人妻av中文系列| 亚洲精品一区二区三区在线观看| 亚洲精品在线观看91| 男人天堂v视频| 欧美福利视频网站| 成人av网站免费观看| ririsao久久精品一区| 国语精品免费视频| 亚洲国产中文字幕在线视频综合| 视频欧美一区| 免费人成在线观看视频播放| 日韩精品一区二| 99这里有精品| 成人精品一区二区三区免费 | 国产精品一品| 久久国产精品久久精品国产| 婷婷开心久久网| 精品日本12videosex| 亚洲综合日韩欧美| 欧美极品少妇xxxxⅹ裸体艺术 | 欧美系列一区| 欧美日韩国产一级二级| 91精品国产乱码久久久久久久| 成人影院在线观看视频| 操日韩av在线电影| 久久久久久免费网| 精品国产亚洲一区二区三区| 国产 日韩 欧美在线| 最好看的2019年中文视频| 成人免费福利片| 欧美91在线|欧美| 久久久久久久久久网| 久久好看免费视频| 久久精品一区四区| 日韩在线亚洲| 国产又猛又黄的视频| 97视频免费在线看| 亚洲精品视频观看| 久久精品国产www456c0m| 一级片免费在线| 成人一区二区在线| 日韩一区二区三区视频在线| 日日噜噜夜夜狠狠视频欧美人| 成人影院在线播放| 黄色网在线视频| 欧美韩国理论所午夜片917电影| 国产亚洲一区二区三区四区| 久久99国产精品久久99大师| 国产视频二区| 国产91aaa| 精品91自产拍在线观看一区| 久久超碰97中文字幕| 成人免费一区| 中文字幕第88页| 国产精品久久久久久久久久久久| 欧美日韩激情小视频| 亚洲九九精品| 日日av拍夜夜添久久免费| 国产美女三级视频| 日韩免费不卡av| 欧美中文字幕一区二区三区亚洲| 美女黄网久久| 祥仔av免费一区二区三区四区| 自拍偷拍精选| 国产精品一区视频| 亚洲免费视频网站| 亚洲欧美中日韩| 亚洲欧洲日本mm| 精品日韩视频| fc2ppv完全颜出在线播放| 91在线观看免费高清| 精品国产成人在线影院| xfplay精品久久| 天天av综合| 波多视频一区| 免费yellow网站| 国产精品伊人日日| 色老头一区二区三区| 亚洲一二三四区| 免费的成人av| 欧美成人午夜77777| 中文日本在线观看| 欧美aⅴ在线观看| 国产精品国产精品国产专区不卡| 亚洲欧美资源在线| 亚洲乱码国产乱码精品精的特点| 亚洲精品专区| 精品视频在线观看免费观看| 国产中文字幕在线| www精品久久| 99久久精品免费看国产四区| 亚洲最新视频在线| 色噜噜狠狠成人中文综合| 成人在线综合网站| 一精品久久久| 成人av在线播放| 九义人在线观看完整免费版电视剧| 国产日产欧美视频| 精品在线不卡| 久久久久亚洲精品国产| 欧美一区二区久久| 亚洲人成在线播放网站岛国 | 欧美成人一区二区在线| 久久久亚洲国产天美传媒修理工| 欧美一区二区黄色|