自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Match 是什么語(yǔ)法?PHP8 也加了

開(kāi)發(fā) 前端
關(guān)于 match 表達(dá)式,很多其他語(yǔ)言并沒(méi)有,比如 Go 語(yǔ)言。不過(guò)有些語(yǔ)言開(kāi)始支持 match,比如 PHP 8.0 就有了 match 表達(dá)式。

[[404809]]

大家好,我是站長(zhǎng) polarisxu。

這是 Rust 勸退系列的第 8 個(gè)教程,探討 Rust 中的模式匹配。

01 match 表達(dá)式

關(guān)于 match 表達(dá)式,很多其他語(yǔ)言并沒(méi)有,比如 Go 語(yǔ)言。不過(guò)有些語(yǔ)言開(kāi)始支持 match,比如 PHP 8.0 就有了 match 表達(dá)式。

一般地可以認(rèn)為 match 和 switch 類似,所以 Rust 中沒(méi)有 switch。

match 用于檢查某個(gè)當(dāng)前的值是否匹配一組/列值中的某一個(gè)??匆粋€(gè)具體的例子:

  1. fn test_match(number: i32) -> &'static str { 
  2.     match number { 
  3.         // 匹配單個(gè)值 
  4.         1 => {println!("One!"); "One!"}, 
  5.         // 匹配多個(gè)值 
  6.         2 | 3 | 5 | 7 | 11 => "This is a prime"
  7.         // 匹配一個(gè)閉區(qū)間范圍 
  8.         13..=19 => "A teen"
  9.         // 處理其他情況 
  10.         _ => "Ain't special"
  11.     } 

看起來(lái)是一個(gè)簡(jiǎn)單的語(yǔ)法結(jié)構(gòu),但大概率在其他語(yǔ)言沒(méi)見(jiàn)過(guò)。簡(jiǎn)單解釋下:

  • 跟其他語(yǔ)言的 switch 類似,可以匹配多個(gè)分支;多個(gè)分支之間,使用 , 分隔;
  • 在 match 分支中,=> 左側(cè)是模式,因此叫做模式匹配,比如 | 表示匹配多個(gè)值;..= 表示匹配一個(gè)范圍;右側(cè)是在左側(cè)匹配成功時(shí)要執(zhí)行的操作;
  • match 要求窮盡,也就是要包含所有可能的值。因此提供了 _,用來(lái)處理所有其他情況,類似 switch 的 default 分支;但只要窮盡了,可以沒(méi)有 _;
  • 如果右側(cè)操作是多個(gè)語(yǔ)句,需要放在 {} 中;
  • match 是表達(dá)式,它的結(jié)果是匹配到的模式中,執(zhí)行操作的最后一個(gè)表達(dá)式的結(jié)果。這在 Rust 中是很常見(jiàn)的,之前提到過(guò),Rust 中一切皆表達(dá)式。所以,這個(gè)例子中 match 表達(dá)式的值即為函數(shù)的返回值。因此,match 的所有分支必須返回同一數(shù)據(jù)類型;
  • 注意 match 表達(dá)式最后是否有分號(hào)的區(qū)別;

日常吐槽:在 match 中匹配區(qū)間,如果想和 for in 一樣,使用 .. 來(lái)表示半閉半開(kāi)區(qū)間,結(jié)果報(bào)錯(cuò)??吹劫Y料說(shuō)應(yīng)該使用 …,但卻提示該語(yǔ)法已廢棄!為啥語(yǔ)法結(jié)構(gòu)還不保持一致呢?!

看一個(gè)接收 match 結(jié)果的例子:

  1. let boolean = true
  2. let binary = match boolean { 
  3.   false => 0, 
  4.   true => 1, 
  5. }; // 注意這里的分號(hào) 
  6. println!("{} -> {}", boolean, binary); 

02 match 其他用法

上面介紹了常規(guī)的 match 操作。match 還有很多其他的用法。

解構(gòu)

當(dāng)元組和 match 一起時(shí),可以解構(gòu)元組。

  1. fn main() { 
  2.   // 試一試將不同的值賦給 `pair` 
  3.     let pair = (0, -2); 
  4.      
  5.     println!("Tell me about {:?}", pair); 
  6.     // match 可以解構(gòu)一個(gè)元組 
  7.     match pair { 
  8.         // 解構(gòu)出第二個(gè)值 
  9.         (0, y) => println!("First is `0` and `y` is `{:?}`", y), 
  10.         (x, 0) => println!("`x` is `{:?}` and last is `0`", x), 
  11.         _      => println!("It doesn't matter what they are"), 
  12.         // `_` 表示不將值綁定到變量 
  13.     } 

關(guān)于枚舉和指針、引用和 match 的結(jié)合,以后遇到再講解。

guard 語(yǔ)句

在 match 分支中可以加上過(guò)濾條件。接著上面元組解構(gòu)的例子:

  1. fn main() { 
  2.     let pair = (2, -2); 
  3.  
  4.     println!("Tell me about {:?}", pair); 
  5.     match pair { 
  6.         (x, y) if x == y => println!("These are twins"), 
  7.         // `if` 條件部分是一個(gè)衛(wèi)語(yǔ)句 
  8.         (x, y) if x + y == 0 => println!("Antimatter, kaboom!"), 
  9.         (x, _) if x % 2 == 1 => println!("The first one is odd"), 
  10.         _ => println!("No correlation..."), 
  11.     } 

綁定

這是什么意思呢?看一個(gè)例子:(來(lái)自 rust by example)

  1. // `age` 函數(shù),返回一個(gè) `u32` 值。 
  2. fn age() -> u32 { 
  3.     15 
  4.  
  5. fn main() { 
  6.     println!("Tell me type of person you are"); 
  7.  
  8.     match age() { 
  9.         0             => println!("I'm not born yet I guess"), 
  10.         // 可以直接 `match` 1 ..= 12,但怎么把歲數(shù)打印出來(lái)呢? 
  11.         // 在 1 ..= 12 分支中綁定匹配值到 `n` ?,F(xiàn)在年齡就可以讀取了。 
  12.         n @ 1  ..= 12 => println!("I'm a child of age {:?}", n), 
  13.         n @ 13 ..= 19 => println!("I'm a teen of age {:?}", n), 
  14.         // 不符合上面的范圍。返回結(jié)果。 
  15.         n             => println!("I'm an old person of age {:?}", n), 
  16.     } 

match 后是一個(gè)函數(shù),我們希望在分支中,根據(jù)匹配結(jié)果,使用 age 函數(shù)的返回值。當(dāng)然,這個(gè)例子有點(diǎn)多此一舉,完全可以在 match 之前用變量存儲(chǔ) age 函數(shù)的返回值。

那換一個(gè)例子:

  1. fn some_number() -> Option<u32> { 
  2.     Some(41) 
  3.  
  4. fn main() { 
  5.     match some_number() { 
  6.         Some(n @ 40..=42) => println!("The Answer: {}!", n), 
  7.         Some(n)      => println!("Not interesting... {}", n), 
  8.         _            => (), 
  9.     } 
  • 關(guān)于 Option 以后講解

這個(gè)例子很好的講解了綁定的作用:分支中想要使用匹配的結(jié)果,通過(guò) @ 符號(hào)可以將匹配的結(jié)果和某個(gè)變量綁定,然后就可以使用這個(gè)變量了。

03 if let 和 while let

這兩個(gè)結(jié)構(gòu)其他語(yǔ)言沒(méi)見(jiàn)過(guò),可以理解為是某些場(chǎng)景下替代 match,讓代碼更簡(jiǎn)潔,因?yàn)?match 必須窮盡所有情況,而 if let 和 while let 沒(méi)有此限制。

以下代碼:

  1. let some_u8_value = Some(3u8); 
  2. match some_u8_value { 
  3.   Some(3) => println!("three"), 
  4.   _ => (), // 有點(diǎn)多余 

改為 if let:

  1. let some_u8_value = Some(3u8); 
  2. if let Some(3) = some_u8_value { 
  3.  println!("three"); 

和 match 一樣,if let 和 while let 都是表達(dá)式;

  • if/while let 等號(hào)左側(cè)是模式,右側(cè)是要匹配的值;所以當(dāng)右側(cè)的值和左側(cè)的模式匹配時(shí),執(zhí)行對(duì)應(yīng)的語(yǔ)句塊;所以,有時(shí)候 if let 也可以單純的當(dāng)做解構(gòu)使用;
  • if let 支持普通的 else if 和 else;while let 沒(méi)有 else;
  • while let 語(yǔ)法和 if let 類似。這里就不舉例子了。

04 小結(jié)

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)。

 

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

2020-07-19 07:44:16

PHP 8.0Match語(yǔ)法

2020-05-28 13:10:27

PHP開(kāi)發(fā)編程

2021-01-12 08:57:55

Fedora 34PHP8開(kāi)發(fā)

2012-03-16 21:25:14

Windows Pho

2022-08-28 10:47:22

Ubuntu

2021-01-14 12:14:13

PHPPHP 8WordPress

2023-02-26 23:36:08

PHPGo函數(shù)

2011-06-27 08:35:28

2025-01-10 08:46:09

2024-03-22 12:22:50

Vue前端

2011-06-15 15:55:36

PHP

2009-11-17 15:07:16

PHP數(shù)組遍歷

2024-04-02 08:02:11

Dockerk8s容器

2011-04-13 17:28:21

2023-01-11 09:56:41

索引SQL

2009-11-30 17:02:13

PHP函數(shù)preg_m

2009-09-16 14:22:44

preg_match正

2009-12-10 15:58:21

PHP preg_ma

2011-07-07 16:41:04

PHP

2009-11-30 18:34:22

PHP簡(jiǎn)單語(yǔ)法
點(diǎn)贊
收藏

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