iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
Software Development

Rust的多方面運用系列 第 10

[Day10] 列舉體與錯誤處理

終於到第十天拉,距離結束基礎語法只剩幾天了,有沒有感到不捨阿
目前計畫跟原本預先想的差不多,但是我在想要不要先介紹幾個常用的套件@@
讓我再想個幾天吧。


今天要介紹的是 enum 列舉體
那這個東西讓 Rust 的簡潔度更高,也有了更多的表現力
這次我也會聯合錯誤處理也就是 Result<T, E> 跟 Option 下去說明。
因為這些錯誤處理就是依靠 enum 構成的。
首先看個簡單的例子

pub enum Option<T> {
    None,
    Some(T),
}

那上面就是 Option 的架構,可以發現其實上面也利用了之前所講的泛型
和結構體不同的是 列舉體 裡面存的是值 而不是類型。也就是說利用 enum 可以在 Rust 中實現 多型。

enum Sizes {
    Big,
    Medium,
    Small,
}

上面就是個以大小區分的 列舉體。
那可以這樣使用

let owo = Sizes::Big;
match owo {
    Big => {println!("Ur Big")},
    Medium => {println!("U Good")},
    Small => {println!("eat more")},
}

那以上是最基礎的使用方式,但是絕對不只於此
因為他是可以帶資料的。

enum Event {
    KeyPress(char),
    Click { x: i64, y: i64 },
}

fn input(event: Event) {
    match event {
        Event::KeyPress(c) => {println!("{}", c)}
        Event::Click{x, y} => {
            println!("{} {}", x, y);
        }
    }
}

就像這樣使用

以上是枚舉的基礎利用

那我剛剛講到 Result 跟 Option 是為了錯誤處理而出現地。
而 Result 跟 Option 差別在哪我下面會提到


Result 是拿來幹嘛的?

Result 是使用列舉體去構成的 原碼如下:

enum Result<T, E> {
    Ok(T),
    Err(E),
}

你可以發現 有個 Ok 跟 Err 廢話
Ok 表示的是這個能夠成功使用
Err 則反
有點類似 try...catch
那麼如果說只想拿 Ok 的情況略過撰寫 match 的話可以使用 unwrap 或是加個問號
還有一個 expect 但是 expect 是當 err 出現時會跑到但是不取值
也就是說可以直接拿來看是否是因為這個部分而導致程式錯誤喔。
那其實 Result 跟 Option 的差別並不大差別只在於
一個是抓錯誤進行處理,一個是當沒有回傳時進行處理。


今天大概這樣 晚安各位
有問題請提問


上一篇
[Day9] Review and Supplement by use Leetcode problem
下一篇
[Day11] 智慧指標
系列文
Rust的多方面運用30

尚未有邦友留言

立即登入留言