Rust 程式設計視訊教程(進階)——022 模式

linghuyichong發表於2020-02-17

頭條地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/

github地址:https://github.com/anonymousGiga/learn_rus...

1、模式是Rust中特殊的語法,模式用來匹配值的結構。

2、模式由如下內容組成:
(1)字面值
(2)解構的陣列、列舉、結構體或者元組
(3)變數
(4)萬用字元
(5)佔位符

3、在Rust中,可能用到模式的位置
(1)match分支
匹配方式:

match VALUE {
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
}

要點:所有情況要匹配完全(即,必須窮盡所有情況),否則報錯

例子:

fn main() {
    let a = 1;
    match a {
        0 => println!("zero"),
        1 => println!("one"),
        _ => println!("other"),//這一句如果註釋掉會報錯
    };
}

(2)if let條件表示式
有選擇的匹配,if let 表示式其窮盡性沒有為編譯器所檢查。
例子:

fn main() {
    let color: Option<&str> = None;
    let is_ok = true;
    let age: Result<u8, _> = "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");
    }
}

(3)while let
允許只要模式匹配就一直進行 while 迴圈。
例子:

fn main() {
    let mut stack = Vec::new(); 
    stack.push(1); 
    stack.push(2); 
    stack.push(3); 
    while let Some(top) = stack.pop() { 
        println!("{}", top); 
    }
}

在上述例子中,一直匹配Some(value),只要匹配就一直迴圈。

(4)for迴圈
在 for 迴圈中,模式是 for 關鍵字直接跟隨的值,正如 for x in y 中的 x。
例子:

fn main() {
    let v = vec!['a', 'b', 'c']; 
    for (index, value) in v.iter().enumerate() { 
        println!("{} is at index {}", value, index); 
    }
}

說明:這裡的模式為(index, value),enumerate 方法適配一個迭代器來產生一個值和其在迭代器中的索引,它們位於一個元組中。第一個 enumerate 呼叫會產生元組 (0, ‘a’)。當這個值匹配模式 (index, value),index 將會是 0 而 value 將會是 ‘a’,並列印出第一行輸出。

(5)let語句

let PATTERN = EXPRESSION;

例子:

let (x, y, z) = (1,2,3);

說明:(1,2,3)匹配模式(x,y,z),會把 1 繫結到 x,2 繫結到 y 並將 3 繫結到 z。
如果希望忽略元組中一個或多個值,也可以使用 _ 或 ..

例子:

let (x, .., y) = (1, 2, 3);
println!("x: {}, y: {}", x, y);

(6)函式引數
函式的引數也是模式。
例子:

fn print_point(&(x, y): &(i32, i32)) { 
    println!("p: ({}, {})", x, y);
} 
fn main() { 
    let point = (3, 5); 
    print_point(&point); 
}

說明:值 &(3, 5) 會匹配模式 &(x, y),如此 x 得到了值 3,而 y得到了值 5。

4、模式在每個使用它的地方並不以相同的方式工作;在一些地方,模式必須是 irrefutable (不可反駁)的,意味著他們必須匹配所提供的任何值。在另一些情況,則是 refutable 的。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

令狐一衝

相關文章