匹配

2018-08-12 22:03 更新

匹配

通常情況下,一個(gè)簡(jiǎn)單的 if/else 是不足夠的,因?yàn)槟憧赡苡袃蓚€(gè)以上的選擇。此外,條件可能變得相當(dāng)復(fù)雜。Rust 有關(guān)鍵字 match,允許你用更強(qiáng)大的 match 關(guān)鍵字,取代復(fù)雜的 if/else 集合。如下所示:

let x = 5;

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

match 采用表達(dá)式的形式,然后根據(jù)它的值來分支。分支的每個(gè)‘臂’都是 val=>expression 的形式。當(dāng)值匹配時(shí),這個(gè)臂的表達(dá)式將被執(zhí)行實(shí)現(xiàn)。之所以稱之為 match 是因?yàn)椤J狡ヅ洹男g(shù)語,而這種正是 match 實(shí)現(xiàn)的形式。這里有一整章關(guān)于模式,包含了這里可能的所有模式。

那么大的優(yōu)勢(shì)是什么呢?這里有幾個(gè)優(yōu)勢(shì)。首先,匹配保障‘窮盡性檢查’。你是否看到了最后一個(gè)下劃線 (_) ?如果我們刪除該下劃線,Rust 將會(huì)給出我們?nèi)缦洛e(cuò)誤:

error: non-exhaustive patterns: `_` not covered

換句話說,Rust 試圖告訴我們,我們忘記了一個(gè)值。因?yàn)?x 是一個(gè)整數(shù),Rust 知道它可以有許多不同的值 - 例如,6。然而,如果沒有 _,將沒有可匹配項(xiàng),所以 Rust 拒絕編譯這段代碼。_ 就像一個(gè)‘全匹配通配符’。如果其他的匹配項(xiàng)都不能匹配,將會(huì)匹配 _ 的分支,由于我們有了全匹配通配符,我們現(xiàn)在對(duì)于 x 的每個(gè)可能值都有一個(gè)匹配項(xiàng),所以我們的程序?qū)?huì)被成功編譯。

match 也是一個(gè)表達(dá)式,這意味著我們可以直接在一個(gè) let 綁定的右邊使用它,或者直接作為表達(dá)式使用:

let x = 5;

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

有時(shí)它是將某種東西從一種類型轉(zhuǎn)換為另一種類型的好方式。

枚舉匹配

match 關(guān)鍵字的另一個(gè)重要的用途是處理一個(gè)枚舉的可能變量:

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),
};
}

再次,Rust 編譯器檢查內(nèi)容詳盡,所以它要求你對(duì)于枚舉的每個(gè)變量都有一個(gè)匹配的臂。如果你遺漏了一個(gè),它將會(huì)給你一個(gè)編譯時(shí)錯(cuò)誤,除非你使用 _

與之前使用的 match 不同,你不可以使用正常的 if 語句來做到這一點(diǎn)。你可以使用可以被看做 match 的一種縮寫形式的if let 語句。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)