最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust 枚舉和模式匹配的實(shí)現(xiàn)

 更新時(shí)間:2023年12月07日 09:50:14   作者:和你一起去月球  
枚舉是 Rust 中非常重要的復(fù)合類型,也是最強(qiáng)大的復(fù)合類型之一,廣泛用于屬性配置、錯(cuò)誤處理、分支流程、類型聚合等場(chǎng)景中,本文就來(lái)介紹一下Rust 枚舉和模式匹配,感興趣的可以了解一下

1、枚舉的定義

枚舉(enumerations),也被稱作 enums。枚舉允許你通過(guò)列舉可能的 成員(variants)來(lái)定義一個(gè)類型。首先,我們會(huì)定義并使用一個(gè)枚舉來(lái)展示它是如何連同數(shù)據(jù)一起編碼信息的。接下來(lái),我們會(huì)探索一個(gè)特別有用的枚舉,叫做 Option,它代表一個(gè)值要么是某個(gè)值要么什么都不是。然后會(huì)講到在 match 表達(dá)式中用模式匹配,針對(duì)不同的枚舉值編寫(xiě)相應(yīng)要執(zhí)行的代碼。最后會(huì)介紹 if let,另一個(gè)簡(jiǎn)潔方便處理代碼中枚舉的結(jié)構(gòu)。

下面看下下面這個(gè)示例:

#[derive(Debug)]
enum Sex {
    Man,
    Woman,
}
fn main() {
    let var = Sex::Man;
    println!("value is {:?}", var)
}

從上面代碼示例中,我們把性別可以枚舉出來(lái),引用枚舉類型的某一個(gè)值的時(shí)候,可以通過(guò)枚舉名后面加一堆冒號(hào)來(lái)引用枚舉中的某一個(gè)屬性值。

下面這個(gè)例子,我們可以在枚舉中,它的成員可以有多種類型:

enum op {
    name(String),
    time(i32),
    People { name: String, age: i32 },
}

有關(guān)聯(lián)值的枚舉的方式和定義多個(gè)不同類型的結(jié)構(gòu)體的方式很相像,除了枚舉不使用 struct 關(guān)鍵字以及其所有成員都被組合在一起。

結(jié)構(gòu)體和枚舉還有另一個(gè)相似點(diǎn):就像可以使用 impl 來(lái)為結(jié)構(gòu)體定義方法那樣,也可以在枚舉上定義方法。

    enum Op {
        Name(String),
        Time(i32),
        People { name: String, age: i32 },
    }

    impl Op {
        fn say(&self) {}
    }

讓我們看看標(biāo)準(zhǔn)庫(kù)中的另一個(gè)非常常見(jiàn)且實(shí)用的枚舉:Option。

1.1 Option 枚舉和其相對(duì)于空值的優(yōu)勢(shì)

這一部分會(huì)分析一個(gè) Option 的案例,Option 是標(biāo)準(zhǔn)庫(kù)定義的另一個(gè)枚舉。Option 類型應(yīng)用廣泛因?yàn)樗幋a了一個(gè)非常普遍的場(chǎng)景,即一個(gè)值要么有值要么沒(méi)值。

例如,如果請(qǐng)求一個(gè)非空列表的第一項(xiàng),會(huì)得到一個(gè)值,如果請(qǐng)求一個(gè)空的列表,就什么也不會(huì)得到。從類型系統(tǒng)的角度來(lái)表達(dá)這個(gè)概念就意味著編譯器需要檢查是否處理了所有應(yīng)該處理的情況,這樣就可以避免在其他編程語(yǔ)言中非常常見(jiàn)的 bug。

編程語(yǔ)言的設(shè)計(jì)經(jīng)常要考慮包含哪些功能,但考慮排除哪些功能也很重要。Rust 并沒(méi)有很多其他語(yǔ)言中有的空值功能。空值(Null )是一個(gè)值,它代表沒(méi)有值。在有空值的語(yǔ)言中,變量總是這兩種狀態(tài)之一:空值和非空值。

然而,空值嘗試表達(dá)的概念仍然是有意義的:空值是一個(gè)因?yàn)槟撤N原因目前無(wú)效或缺失的值。

問(wèn)題不在于概念而在于具體的實(shí)現(xiàn)。為此,Rust 并沒(méi)有空值,不過(guò)它確實(shí)擁有一個(gè)可以編碼存在或不存在概念的枚舉。這個(gè)枚舉是 Option<T>,而且它定義于標(biāo)準(zhǔn)庫(kù)中,如下:

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

Option<T> 也仍是常規(guī)的枚舉,Some(T) 和 None 仍是 Option<T> 的成員。<T> 語(yǔ)法是一個(gè)我們還未講到的 Rust 功能。它是一個(gè)泛型類型參數(shù),所以你需要知道的就是 <T> 意味著 Option 枚舉的 Some 成員可以包含任意類型的數(shù)據(jù),同時(shí)每一個(gè)用于 T 位置的具體類型使得 Option<T> 整體作為不同的類型。這里是一些包含數(shù)字類型和字符串類型 Option 值的例子:

 enum Option<T> {
        None,
        Some(T),
    }
 let some_number = Some(5000);
 let some_char = Some('e');
 let some_boolean = Some(true);

讓我們?cè)倏匆幌氯缦率纠?,定義如下2個(gè)值進(jìn)行相加會(huì)怎么樣?

fn main() {
    enum Option<T> {
        None,
        Some(T),
    }
    let some_number: i8 = 5;

    let absent_number: Option<i8> = Some(5);

    let plus = some_number + absent_number;
}

運(yùn)行結(jié)果如下所示:

在這里有2個(gè)嚴(yán)重的問(wèn)題:

第一個(gè)問(wèn)題是let absent_number: Option<i8> = Some(5); 在這里賦值的時(shí)候會(huì)報(bào)錯(cuò),這2個(gè)類型名看起來(lái)很像,但實(shí)際上是不同的類型,無(wú)法進(jìn)行賦值操作。

第二個(gè)是不同類型進(jìn)行相加的時(shí)候,當(dāng)在 Rust 中擁有一個(gè)像 i8 這樣類型的值時(shí),編譯器確保它總是有一個(gè)有效的值。我們可以自信使用而無(wú)需做空值檢查。只有當(dāng)使用 Option<i8>(或者任何用到的類型)的時(shí)候需要擔(dān)心可能沒(méi)有值,而編譯器會(huì)確保我們?cè)谑褂弥抵疤幚砹藶榭盏那闆r。

 2、match 控制流結(jié)構(gòu)

Rust 有一個(gè)叫做 match 的極為強(qiáng)大的控制流運(yùn)算符,它允許我們將一個(gè)值與一系列的模式相比較,并根據(jù)相匹配的模式執(zhí)行相應(yīng)代碼。模式可由字面值、變量、通配符和許多其他內(nèi)容構(gòu)成;

我們看一下如下示例,能夠更清楚的明白match的作用:

fn main() {
    enum Coin {
        Penny,
        Nickel,
        Dime,
        Quarter,
    }

    fn value_in_cents(coin: Coin) -> u8 {
        match coin {
            Coin::Penny => 1,
            Coin::Nickel => 5,
            Coin::Dime => 10,
            Coin::Quarter => 25,
        }
    }
    let res = value_in_cents(Coin::Nickel);
    print!("result {}", res)  // result 5
}

match 的作用,其他跟其他語(yǔ)言(例如,JavaScript)中的switch差不多,以上代碼中,方法接收了一個(gè)枚舉類型,match根據(jù)枚舉類型的不同成員來(lái)返回的不同的值,類似不同的分支,符合條件的分支,才會(huì)被最后返回,如果匹配到了某一個(gè)分支,想在執(zhí)行其他邏輯的時(shí)候,可以加一對(duì)花括號(hào),在里面寫(xiě)對(duì)應(yīng)的邏輯即可。

    fn value_in_cents(coin: Coin) -> u8 {
        match coin {
            Coin::Penny => {
                print!("res: 執(zhí)行到這了");
                1
            }
            Coin::Nickel => 5,
            Coin::Dime => 10,
            Coin::Quarter => 25,
        }
    }

2.1 匹配 Option<T>

下面編寫(xiě)一個(gè)函數(shù),它獲取一個(gè) Option<i32> ,如果其中含有一個(gè)值,將其加一。如果其中沒(méi)有值,函數(shù)應(yīng)該返回 None 值。

fn plus_one(x: Option<i32>) -> Option<i32> {
        match x {
            None => None,
            Some(i) => Some(i + 1),
        }
    }

    let five = Some(5);
    let six = plus_one(five);
    let none = plus_one(None);
    println!("{:?}  {:?}   {:?}", five, six, none)  // Some(5)  Some(6)   None

2.2 匹配是窮盡的

match 還有另一方面需要討論:這些分支必須覆蓋了所有的可能性。否則不能進(jìn)行編譯。

fn plus_one(x: Option<i32>) -> Option<i32> {
        match x {
            Some(i) => Some(i + 1),
        }
    }

根據(jù)上面錯(cuò)誤提示,我們知道Rust中match匹配必須是窮盡的,否則無(wú)法編譯通過(guò)。

2.3 通配模式和 _ 占位符

我們看一下如下示例:

fn main() {
    let dice_roll = 9;
    match dice_roll {
        3 => 3,
        7 => 7,
        hello => 9,
    };
}

3和7會(huì)匹配對(duì)應(yīng)的值,定義一個(gè)變量例如:hello,則可以匹配其他任意情況下的值。

即使我們沒(méi)有列出 u8 所有可能的值,這段代碼依然能夠編譯,因?yàn)樽詈笠粋€(gè)模式將匹配所有未被特殊列出的值。這種通配模式滿足了 match 必須被窮盡的要求。請(qǐng)注意,我們必須將通配分支放在最后,因?yàn)槟J绞前错樞蚱ヅ涞?。如果我們?cè)谕ㄅ浞种Ш筇砑悠渌种В琑ust 將會(huì)警告我們,因?yàn)榇撕蟮姆种в肋h(yuǎn)不會(huì)被匹配到。

Rust 還提供了一個(gè)模式,當(dāng)我們不想使用通配模式獲取的值時(shí),請(qǐng)使用 _ ,這是一個(gè)特殊的模式,可以匹配任意值而不綁定到該值。這告訴 Rust 我們不會(huì)使用這個(gè)值,所以 Rust 也不會(huì)警告我們存在未使用的變量。

fn main() {
    let dice_roll = 9;
    match dice_roll {
        3 => 3,
        7 => 7,
        _ => 9,
    };
}

當(dāng)我們匹配到其他情況,這種情況下我們不想運(yùn)行任何代碼??梢苑祷匾粋€(gè)空元組,如下所示:

fn main() {
    let dice_roll = 9;

    match dice_roll {
        3 => three(),
        7 => seven(),
        _ => (),
    }
    fn three() {}
    fn seven() {}
}

3、if let 簡(jiǎn)潔控制流

我們先看一個(gè)示例:

fn main() {
    let config_max = Some(3u8);
    match config_max {
        Some(max) => println!("The maximum is configured to be {}", max),
        _ => (),
    }
}

如果值是 Some,我們希望打印出 Some 成員中的值,這個(gè)值被綁定到模式中的 max 變量里。對(duì)于 None 值我們不希望做任何操作。為了滿足 match 表達(dá)式(窮盡性)的要求,必須在處理完這唯一的成員后加上 _ => (),這樣也要增加很多煩人的樣板代碼。

為了簡(jiǎn)化代碼,可以使用if let 來(lái)簡(jiǎn)化一下:

fn main() {
    let config_max = Some(3u8);
    if let Some(max) = config_max {
        println!("res {}", max)
    }
}

使用 if let 意味著編寫(xiě)更少代碼,更少的縮進(jìn)和更少的樣板代碼。然而,這樣會(huì)失去 match 強(qiáng)制要求的窮盡性檢查。match 和 if let 之間的選擇依賴特定的環(huán)境以及增加簡(jiǎn)潔度和失去窮盡性檢查的權(quán)衡取舍。

換句話說(shuō),可以認(rèn)為 if let 是 match 的一個(gè)語(yǔ)法糖,它當(dāng)值匹配某一模式時(shí)執(zhí)行代碼而忽略所有其他值。

至于下環(huán)線匹配的模式,可以通過(guò)if let else 來(lái)實(shí)現(xiàn),如下所示:

fn main() {
    let mut count = 0;
    let config_max = Some(3u8);
    if let Some(max) = config_max {
        println!("res {}", max)
    } else {
        count += 1;
    }
}

到此這篇關(guān)于Rust 枚舉和模式匹配的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Rust 枚舉和模式匹配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Rust中的Drop特性之解讀自動(dòng)化資源清理的魔法

    Rust中的Drop特性之解讀自動(dòng)化資源清理的魔法

    Rust通過(guò)Drop特性實(shí)現(xiàn)了自動(dòng)清理機(jī)制,確保資源在對(duì)象超出作用域時(shí)自動(dòng)釋放,避免了手動(dòng)管理資源時(shí)可能出現(xiàn)的內(nèi)存泄漏或雙重釋放問(wèn)題,智能指針如Box、Rc和RefCell都依賴于Drop來(lái)管理資源,提供了靈活且安全的資源管理方案
    2025-02-02
  • Rust 枚舉和模式匹配的實(shí)現(xiàn)

    Rust 枚舉和模式匹配的實(shí)現(xiàn)

    枚舉是 Rust 中非常重要的復(fù)合類型,也是最強(qiáng)大的復(fù)合類型之一,廣泛用于屬性配置、錯(cuò)誤處理、分支流程、類型聚合等場(chǎng)景中,本文就來(lái)介紹一下Rust 枚舉和模式匹配,感興趣的可以了解一下
    2023-12-12
  • 詳解Rust中的方法

    詳解Rust中的方法

    方法其實(shí)就是結(jié)構(gòu)體的成員函數(shù),在C語(yǔ)言中的結(jié)構(gòu)體是沒(méi)有成員函數(shù)的,但是Rust畢竟也是一門面向?qū)ο蟮木幊陶Z(yǔ)言,所以給結(jié)構(gòu)體加上方法的特性很符合面向?qū)ο蟮奶攸c(diǎn),這篇文章主要介紹了Rust中的方法,需要的朋友可以參考下
    2022-10-10
  • Rust Aya 框架編寫(xiě) eBPF 程序

    Rust Aya 框架編寫(xiě) eBPF 程序

    這篇文章主要介紹了Rust Aya 框架編寫(xiě) eBPF 程序方法的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Rust字符串匹配Rabin-Karp算法詳解

    Rust字符串匹配Rabin-Karp算法詳解

    Rabin-Karp算法也可以叫 Karp-Rabin 算法,它是用來(lái)解決多模式串匹配問(wèn)題的,它的實(shí)現(xiàn)方式有點(diǎn)與眾不同,首先是計(jì)算兩個(gè)字符串的哈希值,然后通過(guò)比較這兩個(gè)哈希值的大小來(lái)判斷是否出現(xiàn)匹配,本文詳細(xì)介紹了字符串匹配Rabin-Karp算法,需要的朋友可以參考下
    2023-05-05
  • Rust 模式匹配示例詳解

    Rust 模式匹配示例詳解

    這篇文章主要為大家介紹了Rust 模式匹配示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 從入門到精通詳解Rust錯(cuò)誤處理完全指南

    從入門到精通詳解Rust錯(cuò)誤處理完全指南

    這篇文章主要為大家詳細(xì)介紹了Rust中錯(cuò)誤處理的相關(guān)方法和技巧,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一
    2025-12-12
  • 深入講解下Rust模塊使用方式

    深入講解下Rust模塊使用方式

    很多時(shí)候,我們寫(xiě)的代碼需要按模塊組織,因?yàn)槲覀儫o(wú)法將大量的代碼都寫(xiě)在一個(gè)文件上,那樣不容易維護(hù),下面這篇文章主要給大家介紹了關(guān)于Rust模塊使用方式的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 使用win10 wsl子系統(tǒng)如何將 rust 程序靜態(tài)編譯為linux可執(zhí)行文件

    使用win10 wsl子系統(tǒng)如何將 rust 程序靜態(tài)編譯為linux可執(zhí)行文件

    這篇文章主要介紹了使用win10 wsl子系統(tǒng)如何將 rust 程序靜態(tài)編譯為linux可執(zhí)行文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-05-05
  • Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解

    Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解

    這篇文章主要為大家介紹了Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論

吴旗县| 利川市| 淮南市| 英德市| 三台县| 青田县| 霍州市| 秦安县| 边坝县| 裕民县| 连山| 衡阳市| 丹巴县| 临武县| 大竹县| 册亨县| 兴安县| 焉耆| 调兵山市| 云安县| 金秀| 伊金霍洛旗| 英德市| 兴山县| 闽清县| 新绛县| 扬州市| 南雄市| 梅州市| 盘锦市| 德清县| 沙雅县| 闻喜县| 旺苍县| 广灵县| 甘肃省| 会宁县| 鹤峰县| 宁夏| 广宗县| 平湖市|