在线二区人妖系列_国产亚洲欧美日韩在线一区_国产一级婬片视频免费看_精品少妇一区二区三区在线

鍍金池/ 教程/ Java/ 匹配
哲學(xué)家就餐問題
鏈接進階
名詞中英文對照
測試
引用和借用
泛型
方法語法
函數(shù)
不安全代碼
并發(fā)
裝箱語法和模式
注釋
棧和堆
運算符與重載
語法索引
文檔
固有功能
所有權(quán)
循環(huán)
通用函數(shù)調(diào)用語法
不定長類型
<code>const</code> 和 <code>static</code>
迭代器
其他語言中的 Rust
枚舉
詞匯表
If語句
猜猜看
錯誤處理
生命周期
編譯器插件
發(fā)布途徑
閉包
trait 對象
不使用標準庫
關(guān)聯(lián)常量
外部函數(shù)接口(FFI)
類型轉(zhuǎn)換
原生類型
匹配
參考文獻
Rust 編程語言
內(nèi)聯(lián)匯編
條件編譯
選擇你的保證
學(xué)習 Rust
`type`別名
自定義內(nèi)存分配器
屬性
if let
高效 Rust
可變性
語法和語義
模式
基準測試
結(jié)構(gòu)體
變量綁定
語言項
切片模式
<code>Deref</code> 強制多態(tài)
關(guān)聯(lián)類型
裸指針
<code>Borrow</code> 和 <code>AsRef</code>
準備
Rust 開發(fā)版
字符串

匹配

match.md
commit fc4bb5f77060b5822f25edbabbdf7a1d48a7f8fe

一個簡單的[if](If If語句.md)/else往往是不夠的,因為你可能有兩個或更多個選項。這樣else也會變得異常復(fù)雜。Rust 有一個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使用一個表達式然后基于它的值分支。每個分支都是val => expression這種形式。當匹配到一個分支,它的表達式將被執(zhí)行。match屬于“模式匹配”的范疇,match是它的一個實現(xiàn)。有[一個整個關(guān)于模式的部分](Patterns 模式.md)講到了所有可能的模式。

那么這有什么巨大的優(yōu)勢呢?這確實有優(yōu)勢。第一,match強制窮盡性檢查exhaustiveness checking)。你看到了最后那個下劃線開頭的分支了嗎?如果去掉它,Rust 將會給我們一個錯誤:

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

Rust 試圖告訴我們忘記了一個值。編譯器從x推斷它可以是任何正的 32 位整型值;例如從 1 到 2,147,483,647。_就像一個匹配所有的分支,它會捕獲所有沒有被match分支捕獲的所有可能值。如你所見,在上個例子中,我們提供了 1 到 5 的mtach分支,如果x是 6 或者其他值,那么它會被_捕獲。

match也是一個表達式,也就是說它可以用在let綁定的右側(cè)或者其它直接用到表達式的地方:

let x = 5;

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

有時,這是一個把一種類型的數(shù)據(jù)轉(zhuǎn)換為另一個類型的好方法。

匹配枚舉(Matching on enums)

match的另一個重要的作用是處理枚舉的可能變量:

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編譯器檢查窮盡性,所以它要求對每一個枚舉的變量都有一個匹配分支。如果你忽略了一個,除非你用_否則它會給你一個編譯時錯誤。

與之前的match的作用不同,你不能用常規(guī)的if語句來做這些。你可以使用[if let](if let.md)語句,它可以被看作是一個match的簡略形式。

上一篇:屬性下一篇:引用和借用