模式
模式由如下內(nèi)容組成:
(1)字面值
(2)解構(gòu)的數(shù)組榜晦、枚舉圣勒、結(jié)構(gòu)體或者元組
(3)變量
(4)通配符
(5)占位符
可能用到模式的位置:
- match
- if let
- while let
- for
- let
- 函數(shù)參數(shù)
反駁
模式有兩種:refutable(可反駁的)和 irrefutable(不可反駁的)。能匹配任何傳遞的可能值的模式被稱為是不可反駁的污抬。對值進(jìn)行匹配可能會失敗的模式被稱為可反駁的怖亭。
不可反駁的:函數(shù)肝箱、let語句、for循環(huán)绵载。原因:因為通過不匹配的值程序無法進(jìn)行有意義的工作埂陆。
if let和while let表達(dá)式被限制為只能接受可反駁的模式,因為它們的定義就是為了處理有可能失敗的條件娃豹。
語法
匹配
-
匹配字面值
match x { 1 => println!("one"), _ => println!("anything"), }
-
匹配命名變量
let y = 10; //1處 match x { Some(50) => println!("Got 50"), Some(y) => println!("Matched, y = {:?}", y), //此處的y和上面1處的y不一樣焚虱,此處是引入的變量y覆蓋之前的y _ => println!("Default case, x = {:?}", x), }
-
多個模式
match x { 1 | 2 => println!("one or two"), _ => println!("anything"), }
-
范圍
match x { 'a'..='j' => println!("early ASCII letter"), 'k'..='z' => println!("late ASCII letter"), _ => println!("something else"), }
解構(gòu)
-
結(jié)構(gòu)體
let p = Point { x: 0, y: 7 }; let Point { x: a, y: b } = p; assert_eq!(0, a); assert_eq!(7, b); //let Point { x, y } = p; //創(chuàng)建了同名的變量,可以簡寫
枚舉
元組
忽略
- 使用
_
忽略整個值或部分值懂版; - 用
..
忽略剩余值鹃栽,必須是無歧義的(一般只用一個)。
其他
匹配守衛(wèi):匹配守衛(wèi)是一個指定于match分支模式之后的額外的if條件躯畴,它必須滿足才能選擇此分支谍咆。
-
綁定:
@
運算符允許我們在創(chuàng)建一個存放值的變量禾锤,并且測試這個變量的值是否匹配模式。match msg { Message::Hello { id: id_variable @ 3..=7 } => { //創(chuàng)建id_variable 存放id的值摹察,同時測試值是否在3到7的范圍 println!("Found an id in range: {}", id_variable) }, _ => {} }