1. 程式人生 > 其它 >Rust學習——列舉和模式匹配

Rust學習——列舉和模式匹配

一、列舉(enums)
Rust中列舉由成員(variants)組成

列舉替代結構體優勢:
1. 每個成員可以處理不同型別和數量的資料

結構體與列舉相似點:
1. 都可以使用impl定義方法
2. 方法體都使用self來獲取呼叫方法的值

Rust沒有空值(即Null),但Rust擁有一個可以編碼存在或不存在概念的列舉(Option):
enum Option {
Some(T),
None,
}
Options列舉很有用,所以已內建在prelude中無需顯示引入作用域。它的成員也不需要通過Option::字首來使用,可直接使用Some和None。即使如此,成員依舊是成員。

若使用None而不是Some,則需要顯示宣告Option的型別,即傳入具體T的型別,因為編譯器只通過None無法推斷Some成員儲存值的型別。

在對Option進行T的運算之前必須將其轉換為T。
通常這能幫助我們捕獲到空值最常見的問題之一:假設某值不為空但實際上為空的情況。

使用Option優點:
不再擔心會錯誤的假設一個非空值,會讓你對程式碼更加有信心。

二、控制流運算子(match)
與if表示式區別:if表示式必須返回一個bool值,而match中可以返回任意型別值。

一個match分支有兩個部分:
1. 一個模式
2. 一些程式碼

  1. 繫結值的模式
    enum UsState {
    Alabama,
    Alaska,
    }
    enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
    }

fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter(state) => {
println!("State quarter from {:?}!", state);
25
},
}
}

呼叫 value_in_cents(Coin::Quarter(UsState: :Alaska))即可訪問到值Alaska。

2.匹配Option
一個在Option上使用match表示式的函式:
fn plus_one(x: Option) -> Option {
match x {
None => None,
Some(i) => Some(i + 1),
}
}

let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);

將match與列舉相結合在很多場景中都是有用的。

Rust中的匹配是窮盡的(exhaustive):必須窮舉到最後的可能性來使程式碼有效。

3.萬用字元(
Rust提供一個模式用於不想列舉出所有可能值的場景。
“ 模式會匹配所有的值,通過將其放置於其他分支之後,_ 會匹配所有之前沒有指定的可能的值。

然而,match 在只關心僅一個分支的場景中顯得囉嗦了,所以Rust提供了 " if let "。

三、簡潔控制流(if let)
if let 獲取獲取通過等號分隔的一個模式和一個表示式。
使用if let 會失去match強制要求的窮盡性檢查。
所以使用match 還是 if let 需要去權衡。

if let 可以包含一個else

學習是一條令人時而喜極若狂、時而鬱鬱寡歡的道路。