視頻地址
頭條地址:https://www.ixigua.com/i6775861706447913485
源碼地址
github地址:見擴展鏈接。
講解內容
1、模式是Rust中特殊的語法,模式用來匹配值的結構。
2、模式由如下內容組成:(1)字面值(2)解構的數組、枚舉、結構體或者元組(3)變量(4)通配符(5)佔位符
3、在Rust中,可能用到模式的位置(1)match分支匹配方式:
<code>match VALUE { PATTERN => EXPRESSION, PATTERN => EXPRESSION, PATTERN => EXPRESSION,}/<code>
要點:所有情況要匹配完全(即,必須窮盡所有情況),否則報錯
例子:
<code>fn main() { let a = 1; match a { 0 => println!("zero"), 1 => println!("one"), _ => println!("other"),//這一句如果註釋掉會報錯 };}/<code>
(2)if let條件表達式有選擇的匹配,if let 表達式其窮盡性沒有為編譯器所檢查。例子:
<code>fn main() { let color: Option = None; let is_ok = true; let age: Result= "33".parse(); if let Some(c) = color { println!("color = {}", c); } else if is_ok { println!("is ok? {}", is_ok); } else if let Ok(a) = age { if a > 30 { println!("oh, mature man"); } else { println!("oh, young man"); } } else { println!("in else"); }} /<code>
(3)while let允許只要模式匹配就一直進行 while 循環。例子:
<code>fn main() { let mut stack = Vec::new(); stack.push(1); stack.push(2); stack.push(3); while let Some(top) = stack.pop() { println!("{}", top); }}/<code>
在上述例子中,一直匹配Some(value),只要匹配就一直循環。
(4)for循環在 for 循環中,模式是 for 關鍵字直接跟隨的值,正如 for x in y 中的 x。例子:
<code>fn main() { let v = vec!['a', 'b', 'c']; for (index, value) in v.iter().enumerate() { println!("{} is at index {}", value, index); }}/<code>
說明:這裡的模式為(index, value),enumerate 方法適配一個迭代器來產生一個值和其在迭代器中的索引,它們位於一個元組中。第一個 enumerate 調用會產生元組 (0, ‘a’)。當這個值匹配模式 (index, value),index 將會是 0 而 value 將會是 ‘a’,並打印出第一行輸出。
(5)let語句
<code>let PATTERN = EXPRESSION;/<code>
例子:
<code>let (x, y, z) = (1,2,3);/<code>
說明:(1,2,3)匹配模式(x,y,z),會把 1 綁定到 x,2 綁定到 y 並將 3 綁定到 z。如果希望忽略元組中一個或多個值,也可以使用 _ 或 ..
例子:
<code>let (x, .., y) = (1, 2, 3);println!("x: {}, y: {}", x, y);/<code>
(6)函數參數函數的參數也是模式。例子:
<code>fn print_point(&(x, y): &(i32, i32)) { println!("p: ({}, {})", x, y);} fn main() { let point = (3, 5); print_point(&point); }/<code>
說明:值 &(3, 5) 會匹配模式 &(x, y),如此 x 得到了值 3,而 y得到了值 5。
4、模式在每個使用它的地方並不以相同的方式工作;在一些地方,模式必須是 irrefutable (不可反駁)的,意味著他們必須匹配所提供的任何值。在另一些情況,則是 refutable 的。
閱讀更多 令狐一衝a 的文章