1. 程式人生 > >Rust 1.7.0 匹配器 match 的簡介和使用

Rust 1.7.0 匹配器 match 的簡介和使用

let 滿足 選擇 多個 efault msg i++ pretty article

使用過正則表達式的人應該都知道 matcher ,通過 matcher 匹配器運算正則表達式,完畢一系列的匹配規則。

在Rust 中 沒有 switch 語句。matcher 就是 switch 的一個變形,但比其它語言中的 switch 更強大!

一、簡單舉例說明

簡單的 matcher 和 if 語句很相似,假設是簡單的條件推斷能夠用if語句:

let n = 5;

if n < 0 {
    print!("{} is negative", n);
} else if n > 0 {
    print!("{} is positive", n);
} else {
    print!("{} is zero", n);
}

復雜一些的條件推斷,使用 if 語句就有些力不從心了。

match 能夠這樣:

let x = 5;

match x {
    1 => println!("one"),
    2 => println!("two"),
    3 => println!("three"),
    4 => println!("four"),
    5 => println!("five"),
    _ => println!("something else"),
}

假設 x == 1 ,打印 one
假設 x == 2, 打印 two
假設 x == 3, 打印 three
假設 x == 4, 打印 four
假設 x == 5, 打印 five
假設沒有與 x 匹配的值。
則運行 _ 相應的語句,打印 something else。

解釋一下上面的代碼的match語句,

  • match 是關鍵字。
  • x 是表達式。(非結構化的文本表達式)
  • match語句內容包括在 {}大括號裏;
  • 括號裏的每一個 => 叫做 match-arm。
  • 大括號裏能夠包括隨意多個 match-arm。
  • 當 x 存在可能不匹配的情況時,大括號裏必須包括 _ => 來覆蓋不論什麽不匹配的情況下運行的語句,就像 switch 中的 default 一樣。

match語句中 x 表達式的值。要與{}大括號裏的每一個match-arm分支進行匹配。

假設匹配,則運行匹配 match-arm 中 =>後面的語句。

match本身也是個表達式,Rust就是基於表達式的語言。

表達式是能夠作為右值使用的。

所謂右值,就是看一個表達式是否能放到等號的=等號右邊。
比方x = 1+21+2能夠發到=的右邊。所以 1+2能夠是個右值;
可是 1+2 = x,這個語句中1+2不能放到等號的左邊,所以 1+2不可能是左值。

let x = 5;

let number = match x {
    1 => "one",
    2 => "two",
    3 => "three",
    4 => "four",
    5 => "five",
    _ => "something else",
};

這個 match 語句完畢了 數字字符 的轉換,number中的值是 five 。

二、另外幾個樣例

單值、多值和範圍匹配

let number = 13;   
println!("Tell me about {}", number);
match number {
    1 => println!("One!"),
    2 | 3 | 5 | 7 | 11 => println!("This is a prime"),
    13...19 => println!("A teen"),
    _ => println!("Ain‘t special"),
}

布爾值的樣例

  let boolean = true;
  let binary = match boolean {
   false => 0,
    true => 1,
  };  
  println!("{} -> {}", boolean, binary);

這裏不存在 _ =>這個 match-arm。是由於 true 和 false這兩個值已經全然覆蓋boolean的全部值域。

枚舉的樣例

enum Message {
    Quit,
    ChangeColor(i32, i32, i32),
    Move { x: i32, y: i32 },
    Write(String),
}

fn quit() { /* ... */ }
fn change_color(r: i32, g: i32, b: i32) { /* ... */ }
fn move_cursor(x: i32, y: i32) { /* ... */ }

fn process_message(msg: Message) {
    match msg {
        Message::Quit => quit(),
        Message::ChangeColor(r, g, b) => change_color(r, g, b),
        Message::Move { x: x, y: y } => move_cursor(x, y),
        Message::Write(s) => println!("{}", s),
    };

這裏的 match msg 也沒有實現 _ => 這個match-arm,是由於match msg 裏面的值全然覆蓋了枚舉 Message 中的值,假設把match msg 中的隨意一個 match-arm 去掉,就必須實現 _ => 語句了。

match msg {
        Message::ChangeColor(r, g, b) => change_color(r, g, b),
        Message::Move { x: x, y: y } => move_cursor(x, y),
        Message::Write(s) => println!("{}", s),
        _=> quit(),
    };

條件選擇

let n  = 3;
match n  {
  n if n > 2 => println!("> 2"),
  n if n < 3 => println!("< 3"),
  _ => println!("some else"),
};

在 match-arm的 => 前面能夠有一個if 條件。即使 match 匹配。還能夠通過 if 進行過濾。

假設這樣,又怎樣呢?

let n  = 4;
match n  {
  n if n > 2 => println!("> 2"),
  n if n > 3 => println!("> 3"),
  _ => println!("some else"),
};

match 遇到第一個匹配的結果,就不再往下繼續匹配了,僅僅運行第一個滿足條件的語句。

上面的代碼變體:

let n  = 4;
match n  {
  x => println!(" x = {}",x),
};

x 被賦值 n ,即:let x = n

Rust 1.7.0 匹配器 match 的簡介和使用