掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
大家好,我是站長(zhǎng) polarisxu。

為海林等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及海林網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)、海林網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
這是 Rust 勸退系列的第 8 個(gè)教程,探討 Rust 中的模式匹配。
關(guān)于 match 表達(dá)式,很多其他語(yǔ)言并沒(méi)有,比如 Go 語(yǔ)言。不過(guò)有些語(yǔ)言開始支持 match,比如 PHP 8.0 就有了 match 表達(dá)式。
一般地可以認(rèn)為 match 和 switch 類似,所以 Rust 中沒(méi)有 switch。
match 用于檢查某個(gè)當(dāng)前的值是否匹配一組/列值中的某一個(gè)??匆粋€(gè)具體的例子:
- fn test_match(number: i32) -> &'static str {
- match number {
- // 匹配單個(gè)值
- 1 => {println!("One!"); "One!"},
- // 匹配多個(gè)值
- 2 | 3 | 5 | 7 | 11 => "This is a prime",
- // 匹配一個(gè)閉區(qū)間范圍
- 13..=19 => "A teen",
- // 處理其他情況
- _ => "Ain't special",
- }
- }
看起來(lái)是一個(gè)簡(jiǎn)單的語(yǔ)法結(jié)構(gòu),但大概率在其他語(yǔ)言沒(méi)見過(guò)。簡(jiǎn)單解釋下:
日常吐槽:在 match 中匹配區(qū)間,如果想和 for in 一樣,使用 .. 來(lái)表示半閉半開區(qū)間,結(jié)果報(bào)錯(cuò)??吹劫Y料說(shuō)應(yīng)該使用 …,但卻提示該語(yǔ)法已廢棄!為啥語(yǔ)法結(jié)構(gòu)還不保持一致呢?!
看一個(gè)接收 match 結(jié)果的例子:
- let boolean = true;
- let binary = match boolean {
- false => 0,
- true => 1,
- }; // 注意這里的分號(hào)
- println!("{} -> {}", boolean, binary);
上面介紹了常規(guī)的 match 操作。match 還有很多其他的用法。
解構(gòu)
當(dāng)元組和 match 一起時(shí),可以解構(gòu)元組。
- fn main() {
- // 試一試將不同的值賦給 `pair`
- let pair = (0, -2);
- println!("Tell me about {:?}", pair);
- // match 可以解構(gòu)一個(gè)元組
- match pair {
- // 解構(gòu)出第二個(gè)值
- (0, y) => println!("First is `0` and `y` is `{:?}`", y),
- (x, 0) => println!("`x` is `{:?}` and last is `0`", x),
- _ => println!("It doesn't matter what they are"),
- // `_` 表示不將值綁定到變量
- }
- }
關(guān)于枚舉和指針、引用和 match 的結(jié)合,以后遇到再講解。
guard 語(yǔ)句
在 match 分支中可以加上過(guò)濾條件。接著上面元組解構(gòu)的例子:
- fn main() {
- let pair = (2, -2);
- println!("Tell me about {:?}", pair);
- match pair {
- (x, y) if x == y => println!("These are twins"),
- // `if` 條件部分是一個(gè)衛(wèi)語(yǔ)句
- (x, y) if x + y == 0 => println!("Antimatter, kaboom!"),
- (x, _) if x % 2 == 1 => println!("The first one is odd"),
- _ => println!("No correlation..."),
- }
- }
綁定
這是什么意思呢?看一個(gè)例子:(來(lái)自 rust by example)
- // `age` 函數(shù),返回一個(gè) `u32` 值。
- fn age() -> u32 {
- 15
- }
- fn main() {
- println!("Tell me type of person you are");
- match age() {
- 0 => println!("I'm not born yet I guess"),
- // 可以直接 `match` 1 ..= 12,但怎么把歲數(shù)打印出來(lái)呢?
- // 在 1 ..= 12 分支中綁定匹配值到 `n` ?,F(xiàn)在年齡就可以讀取了。
- n @ 1 ..= 12 => println!("I'm a child of age {:?}", n),
- n @ 13 ..= 19 => println!("I'm a teen of age {:?}", n),
- // 不符合上面的范圍。返回結(jié)果。
- n => println!("I'm an old person of age {:?}", n),
- }
- }
match 后是一個(gè)函數(shù),我們希望在分支中,根據(jù)匹配結(jié)果,使用 age 函數(shù)的返回值。當(dāng)然,這個(gè)例子有點(diǎn)多此一舉,完全可以在 match 之前用變量存儲(chǔ) age 函數(shù)的返回值。
那換一個(gè)例子:
- fn some_number() -> Option
{ - Some(41)
- }
- fn main() {
- match some_number() {
- Some(n @ 40..=42) => println!("The Answer: {}!", n),
- Some(n) => println!("Not interesting... {}", n),
- _ => (),
- }
- }
這個(gè)例子很好的講解了綁定的作用:分支中想要使用匹配的結(jié)果,通過(guò) @ 符號(hào)可以將匹配的結(jié)果和某個(gè)變量綁定,然后就可以使用這個(gè)變量了。
這兩個(gè)結(jié)構(gòu)其他語(yǔ)言沒(méi)見過(guò),可以理解為是某些場(chǎng)景下替代 match,讓代碼更簡(jiǎn)潔,因?yàn)?match 必須窮盡所有情況,而 if let 和 while let 沒(méi)有此限制。
以下代碼:
- let some_u8_value = Some(3u8);
- match some_u8_value {
- Some(3) => println!("three"),
- _ => (), // 有點(diǎn)多余
- }
改為 if let:
- let some_u8_value = Some(3u8);
- if let Some(3) = some_u8_value {
- println!("three");
- }
和 match 一樣,if let 和 while let 都是表達(dá)式;
Rust 中的 match 雖然和其他語(yǔ)言的 switch 類似,很顯然,match 的復(fù)雜度比 switch 高。當(dāng)然,不管復(fù)雜與否,最關(guān)鍵還是要實(shí)際使用,需要不斷實(shí)際練習(xí)。
通常,match 和 Option、枚舉一起使用,因此,在講解這兩個(gè)知識(shí)點(diǎn)時(shí),一般會(huì)使用到 match。
本文轉(zhuǎn)載自微信公眾號(hào)「polarisxu」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系polarisxu公眾號(hào)。
新聞標(biāo)題:Match是什么語(yǔ)法?PHP8也加了
網(wǎng)站網(wǎng)址:http://uogjgqi.cn/article/ccdepgo.html

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流