Rust -- 模式與匹配

北門吹雪發表於2023-04-26

1. 模式

用來匹配型別中的結構(資料的形狀),結合 模式和match表示式 提供程式控制流的支配權

  • 模式組成內容
  • 字面量
  • 解構的陣列、列舉、結構體、元祖
  • 變數
  • 萬用字元
  • 佔位符

流程:匹配值 --> 是否擁有正確的資料 --> 執行特定的程式碼

2. 使用模式的位置

  • match分支:由match關鍵字、一個匹配的值和一個或多個分支構成
    • 窮盡性:所有可能的值都必須考慮到
    • _: 匹配所有情況,不繫結任何變數
enum Status {
    // 其中對應的值透過 Status::OK as i32方式取出
    OK = 200,
    NotFound = 404,
    Create = 201
}

fn main() {
    let status = Status::OK;

    match status {
        // 將列舉
        Status::OK => println!("{}", Status::OK as i32),
        _ => println!()
    }
}
  • if let 語句

只關心一種情況的match分支的簡寫,可選的else在模式不匹配時執行,可以靈活搭配 else if 、else if let,搭配之間不需要關聯性

  • while let 條件迴圈

只要模式匹配就一直進行while迴圈

fn main() {
    let mut stack = Vec::new();
    // 推入資料
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);

    // 彈出資料
    while let Some(v) = stack.pop() {
        println!("value: {}", v)
    }
}
  • for迴圈

模式是for關鍵字直接跟隨的值

fn main() {
    let valuse = vec![1, 2, 3, 4, 5];
    
    // 遍歷vector,使用了模式對元祖進行解構
    for (index, value) in valuse.iter().enumerate() {
        println!("index: {}, value: {}", index, value)
    }
}
  • let 語句

將模式與表示式進行比較,併為任何找到的名稱賦值

fn main() {
    // 結構元祖
    let (x, y, z) = (1, 2, 3);
    println!("{}, {}, {}", z, y, x);
    
    // 普通變數宣告
    let x = 5;
}
  • 函式引數

與let語句一致

fn function_pattern(&(x, y): &(i32, i32)) -> i32 {
    x + y
}

fn main() {
    let num = (1, 2);
    let sum = function_pattern(&num);
    println!("sum: {}", sum)
}

3. 模式分類

依據:是否會匹配可能失敗

  • 不可反駁: 能匹配任何傳遞的可能值
  • let語句 for迴圈 函式
  • 可反駁: 對某些可能存在的值進行匹配會失敗
  • if let、 while let、match分支

4. 模式語法

  • 匹配字面量
fn main() {
    let name = "beimen";

    match name {
        "beimen" => println!("beimen"),
        "chuixue" => println!("chuixue"),
        _ => println!("unknown")
    }
}

相關文章