Rust控制流運(yùn)算符match的用法詳解
概述
match 是Rust中一個極為強(qiáng)大的控制流運(yùn)算符,用于模式匹配和控制流的選擇。它允許將一個值與一系列的模式相比較,根據(jù)匹配的模式執(zhí)行相應(yīng)代碼。模式可由字面量、變量、通配符和許多其他內(nèi)容構(gòu)成。
模式由以下元素(的一些組合)組成:
- 字面量
- 解構(gòu)的數(shù)組
- 枚舉類型
- 結(jié)構(gòu)體
- 處理?xiàng)l件表達(dá)式
- 通配符
- 占位符
我們可以把match表達(dá)式想象成某種硬幣分類器:硬幣滑入有著不同大小孔洞的軌道,每個硬幣都會掉入符合它大小的空洞。同樣地,值也會通過match的每一個模式,并且在遇到第一個“符合”的模式時,值會進(jìn)入相關(guān)的代碼塊并在執(zhí)行中被使用。
基礎(chǔ)語法
match value { pattern1 => { //code1 } pattern2 => { //code2 } _ => { //沒有任何匹配 } }
基礎(chǔ)語法中,value是要匹配的變量,pattern是匹配模式, => 后面是要執(zhí)行的代碼。末尾使用通配符“ - ”(下劃線)表示其他情況。如果value匹配了某個模式,就執(zhí)行相應(yīng)代碼塊,如果value沒有匹配任何模式,就會執(zhí)行默認(rèn)的代碼塊,即( _ => {...},)。
讓我們編寫一個函數(shù)來獲取一個未知的硬幣,并以一種類似驗(yàn)鈔機(jī)的方式,確定它時何種硬幣并返回它的美分值。
//一個枚舉和一個以枚舉成員作為模式的match表達(dá)式 enum Coin { Penny, Nickel, Dime, Quarter, } fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, } }
如果分支代碼較短的話通常不使用大括號,如果想要在分支中運(yùn)行多行代碼,可以使用大括號。
fn value_in_cents(coin:Coin) -> u8 { match coin { Coin::Penny => { println!("Lucy penny!"); 1 } Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter =>25, } }
綁定值的模式
匹配分支的另一個有用的功能是可以綁定匹配的模式的部分值。也就是可以從枚舉成員中提取值的方式。
舉個例子,讓我們修改枚舉中的一個成員來存放數(shù)據(jù)。1999年到2008年間,美國在25美分的硬幣的一側(cè)為50個州的每一個都印刷了不同的設(shè)計。其他的硬幣都沒有這種區(qū)分州的設(shè)計,只有這些25美分的硬幣有特殊的價值。可以將這些信息加入我們的enum,通過改變Quarter成員來包含一個State值。
//Quarter成員也存放一個UsState值的Coin枚舉 #[derive(Debug)] enum UsState { Alabama, Alaska, //--snip-- } enum Coin { Penny, Nickel, Dime, Quarter(UsState), }
假設(shè)我們的一個朋友正在嘗試收集所有50個州25美分硬幣。根據(jù)硬幣類型分類零錢的同時,也可以報告出每個25美分硬幣所對應(yīng)的州名稱,如果他沒有的話,他可以將其加入收藏。
fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime =>10, Coin::Quarter(state) => { println!("State quarter from {:?}!", state); 25 } } }
調(diào)用value_in_cents(Coin::Quarter(UsState::Alaska),coin將是Coin::Quarter(UsState::Alaska)。這時state綁定的值是UsState::Alaska。然后在pintln!表達(dá)式中使用這個綁定就可以獲取Coin枚舉的Quarter成員中內(nèi)部的州的值。
匹配Option<T>
我們想要編寫一個函數(shù),它獲取一個Option<i32>,如果其中含有一個值,將其加一。如果其中沒有值,函數(shù)應(yīng)該返回None值,二不嘗試執(zhí)行任何操作。
// 一個Option<i32>上使用match表達(dá)式的函數(shù) fn plus_one (x: Option<i32>) -> Option<i32> { match x { None => None, Some(i) => Some(i+1), } } let five = Some(5); let six =plus_one(five); let none = plus_one(None);
匹配Some(T)
匹配是窮盡的
Rust知道我們沒有覆蓋所有可能的情況甚至指導(dǎo)哪些模式被忘記了!Rust中的匹配時窮盡的:必須窮舉到最后的可能性來使代碼有效。特別是在Option<T>的例子中,Rust防止我們忘記明確的處理None的情況,這讓我們免于假設(shè)擁有一個實(shí)際上為空的值,從而錯誤不可能發(fā)生。
通配符和 _ 占位符
假設(shè)我們正在玩一個游戲,如果你擲出骰子的值為3,角色不會移動,而是會得到一頂新奇的帽子。如果擲出骰子的值為7,你的角色將失去新奇的帽子。對于其他的數(shù)值,你的角色會在棋盤上移動相應(yīng)的格子。
let dice_roll = 9; match dice_roll { 3 => add_fancy_hat(), 7 => remove_fancy_hat(), other => move_player(other), } fn add_fancy_hat() {} fn remove_fancy_hat() {} fn move_player(num_spaces: u8) {}
這是一個實(shí)現(xiàn)上述邏輯的match,匹配模式是字面值3和7,最后一個分支則涵蓋了所有其他可能的值,模式是我們命名為other的一個變量。other分支的代碼通過將其傳遞給move_player函數(shù)來使用這個變量。
最后一個模式?jīng)]有列出u8所有可能的值,代碼依舊能夠編譯。這種通配模式滿足了match必須被窮盡的要求,必須將通配分支放在最后,因?yàn)槟J绞前错樞蚱ヅ涞摹?/p>
當(dāng)我們不想使用通配模式獲取的值時,可以使用 _ 模式。這個模式可以匹配任意值而不綁定到該值。
改變游戲規(guī)則:現(xiàn)在,當(dāng)你擲出覺得值不是3或7的時候,你必須再次擲出。這種情況下我們不需要使用這個值。我們修改代碼使用"_"代替變量other:
let dice_roll = 9; match dice_roll { 3 => add_fancy_hat(), 7 => remove_fancy_hat(), _ => reroll(), } fn add_fancy_hat() {} fn remove_fancy_hat() {} fn reroll() {}
最后一個分支中明確忽略了其他的值,也滿足了窮舉性要求。
改變游戲規(guī)則:如果擲出3或7以外的值,你的回合將無事發(fā)生。使用單元值(空元組)作為_分支的代碼:
let dice_roll = 9; match dice_roll { 3 => add_fancy_hat(), 7 => remove_fancy_hat(), _ => (), } fn add_fancy_hat() {} fn remove_fancy_hat() {}
到此這篇關(guān)于Rust控制流運(yùn)算符match的用法詳解的文章就介紹到這了,更多相關(guān)Rust控制流運(yùn)算符match內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
rust中間件actix_web在項(xiàng)目中的使用實(shí)戰(zhàn)
這篇文章主要介紹了rust中間件在項(xiàng)目中的使用實(shí)戰(zhàn),包括自定義中間件,日志中間件,Default?headers,用戶會話,錯誤處理的用法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Windows系統(tǒng)下安裝Rust環(huán)境超詳細(xì)教程
這篇文章主要介紹了如何在Windows系統(tǒng)上安裝mingw64和Rust,mingw64是一個輕便的C語言編譯環(huán)境,可以替代Rust默認(rèn)使用的Visual?Studio,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02如何基于Rust實(shí)現(xiàn)文本搜索minigrep
這篇文章主要介紹了基于Rust實(shí)現(xiàn)的文本搜索minigrep,本次演示介紹針對原作者代碼程序的查詢邏輯做了一點(diǎn)點(diǎn)小的優(yōu)化,原程序邏輯的查詢是放在了程序運(yùn)行的時候,邏輯修改后啟動的時候可以添加參數(shù),也可以啟動后添加,需要的朋友可以參考下2024-08-08Rust重載運(yùn)算符之復(fù)數(shù)四則運(yùn)算的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Rust如何實(shí)現(xiàn)復(fù)數(shù)以及復(fù)數(shù)的四則運(yùn)算,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08