rust中的match表達(dá)式使用詳解
match使用
在rust中提供了一個(gè)極為強(qiáng)大的控制流運(yùn)算符match
match
允許一個(gè)值與一系列模式進(jìn)行匹配,并執(zhí)行匹配的模式對(duì)應(yīng)的代碼- 這些模式可以是
子面值
、變量名
、通配符
等等
來(lái)個(gè)例子
fn main() { println!("penny {}", value_in_cents(Coin::Penny)) // penny 1 } 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 => { println!("多行的情況需要加上花括號(hào)"); 25 }, } }
綁定值的模式
匹配的分支可以綁定到被匹配對(duì)象的部分值,因此我們可以從enum
變體中獲取值
fn main() { println!("penny {}", value_in_cents(Coin::Quarter(UsState::Alabama))) // State quarter from Alabama\n penny 25 } #[derive(Debug)] enum UsState { Alabama, Alaska, } enum Coin { Penny, Nickel, Dime, Quarter(UsState), } 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 }, } }
在rust的match匹配中,必須要窮舉所有的變體
但是如果match
要匹配的變體
太多了,我們不想處理那么多該怎么辦呢?
- 可以使用通配符
_
來(lái)替代其余沒(méi)列出的值
fn main() { let v = 0u8; match v { 1 => println!("one"), 2 => println!("two"), 3 => println!("three"), // 其他的不想匹配了,可以使用`_`替代,下?lián)Q線通配符只能放到最后一行 _ => println!("other") } }
match語(yǔ)法糖【if let】
上述的例子可以使用if let
控制流進(jìn)行改寫(xiě)
fn main() { let v = 0u8; match v { 1 => println!("one"), 2 => println!("two"), 3 => println!("three"), // 其他的不想匹配了,可以使用`_`替代,下?lián)Q線通配符只能放到最后一行 _ => println!("other"), } // 可以使用let進(jìn)行簡(jiǎn)寫(xiě) if let 3 = v { println!("three"); } else { println!("other") } }
小結(jié)一下if let
的作用
- 處理只關(guān)心一種匹配二忽略其他匹配的情況
- 更少的代碼、更少的縮進(jìn)、更少的模板代碼
- 放棄了窮舉的可能
- 我們可以把
if let
當(dāng)做是match
的語(yǔ)法糖
匹配Option
fn main() { let five = Some(5); let six = plus_one(five); let none = plus_one(None); // 使用模式匹配和Option可以避免其他語(yǔ)言出現(xiàn)NPE的問(wèn)題 match six { Some(value) => println!("six: {}", value), None => println!("six: None"), } match none { Some(value) => println!("none: {}", value), None => println!("none: None"), } } fn plus_one(x: Option<i32>) -> Option<i32> { match x { None => None, Some(i) => Some(i + 1) } }
到此這篇關(guān)于rust中的 match表達(dá)式的文章就介紹到這了,更多相關(guān)rust match表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust編寫(xiě)自動(dòng)化測(cè)試實(shí)例權(quán)威指南
這篇文章主要為大家介紹了Rust編寫(xiě)自動(dòng)化測(cè)試實(shí)例權(quán)威指南詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Rust 連接 SQLite 數(shù)據(jù)庫(kù)的過(guò)程解析
本文通過(guò)一個(gè)例子給大家介紹了Rust 連接 SQLite 數(shù)據(jù)庫(kù)的詳細(xì)過(guò)程,我使用rusqlite這個(gè)crate,對(duì)Rust 連接 SQLite 數(shù)據(jù)庫(kù)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2022-01-01Rust 語(yǔ)言的全鏈路追蹤庫(kù) tracing使用方法
這篇文章主要介紹了Rust 語(yǔ)言的全鏈路追蹤庫(kù) tracing,接下來(lái)就以 tracing 為例,介紹一下trace 的核心概念以及使用方法,需要的朋友可以參考下2022-12-12從零開(kāi)始使用Rust編寫(xiě)nginx(TLS證書(shū)快過(guò)期了)
wmproxy已用Rust實(shí)現(xiàn)http/https代理,?socks5代理,?反向代理,?負(fù)載均衡,?靜態(tài)文件服務(wù)器,websocket代理,四層TCP/UDP轉(zhuǎn)發(fā),內(nèi)網(wǎng)穿透等,本文給大家介紹從零開(kāi)始使用Rust編寫(xiě)nginx(TLS證書(shū)快過(guò)期了),感興趣的朋友一起看看吧2024-03-03Rust調(diào)用Windows API 如何獲取正在運(yùn)行的全部進(jìn)程信息
本文介紹了如何使用Rust調(diào)用WindowsAPI獲取正在運(yùn)行的全部進(jìn)程信息,通過(guò)引入winapi依賴并添加相應(yīng)的features,可以實(shí)現(xiàn)對(duì)不同API集的調(diào)用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-11-11詳解rust?自動(dòng)化測(cè)試、迭代器與閉包、智能指針、無(wú)畏并發(fā)
這篇文章主要介紹了rust?自動(dòng)化測(cè)試、迭代器與閉包、智能指針、無(wú)畏并發(fā),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11詳解Rust調(diào)用tree-sitter支持自定義語(yǔ)言解析
使用Rust語(yǔ)言結(jié)合tree-sitter庫(kù)解析自定義語(yǔ)言需要定義語(yǔ)法、生成C解析器,并在Rust項(xiàng)目中集成,具體步驟包括創(chuàng)建grammar.js定義語(yǔ)法,使用tree-sitter-cli工具生成C解析器,以及在Rust項(xiàng)目中編寫(xiě)代碼調(diào)用解析器,這一過(guò)程涉及到對(duì)tree-sitter的深入理解和Rust語(yǔ)言的應(yīng)用技巧2024-09-09