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

Rust指南枚舉類與模式匹配詳解

 更新時(shí)間:2022年09月08日 14:37:45   作者:微涼秋意  
這篇文章主要介紹了Rust指南枚舉類與模式匹配精講,枚舉允許我們列舉所有可能的值來(lái)定義一個(gè)類型,枚舉中的值也叫變體,今天通過(guò)一個(gè)例子給大家詳細(xì)講解,需要的朋友可以參考下

前言

書接上文,本篇博客分享的是Rust 枚舉類與模式匹配 的知識(shí)。作為安全性強(qiáng)的語(yǔ)言,Rust 的枚舉類并不像其他編程語(yǔ)言中的概念那樣簡(jiǎn)單,但依然可以十分簡(jiǎn)單的使用。

1、Rust基本枚舉類語(yǔ)法

枚舉允許我們列舉所有可能的值來(lái)定義一個(gè)類型,枚舉中的值也叫變體

1.1、定義枚舉

我們舉一個(gè)例子:

IP地址:IPV4、IPV6

enum IpAddrKind{
	V4,
	V6
}

接收枚舉值

let four=IpAddrKind::V4;
let six=IpAddrKind::V6;

枚舉的變體都位于標(biāo)識(shí)符的命名空間下,使用::進(jìn)行分割

1.2、將數(shù)據(jù)附加到枚舉的變體中

形式如下:

enum IpAddr{
	V4(String),
	V6(String)
}

優(yōu)點(diǎn):

  • 不需要額外使用struct來(lái)確定類型
  • 每個(gè)變體可以擁有不同的類型以及關(guān)聯(lián)的數(shù)據(jù)量

例如:

#[derive(Debug)]
enum IpAddrKind {
    V4(u8,u8,u8,u8),
    V6(String)
}

fn main() {
    let home=IpAddrKind::V4(127, 0, 0, 1);
    let loopback=IpAddrKind::V6(String::from("這是IPV6"));
    println!("{:?}\n{:?}",home,loopback);
}

運(yùn)行效果:

  • #[derive(Debug)]作為Rust提供的調(diào)試庫(kù)是可以直接輸出結(jié)構(gòu)體和枚舉類型的
  • 但是注意占位符只能使用{:?}
  • 標(biāo)準(zhǔn)庫(kù)中的IpAddr
struct IpV4Addr{
    //--snip--
}
struct IpV6Addr{
    //--snip--
}

enum IpAddr {
    V4(IpV4Addr),
    V6(IpV6Addr)
}

1.3、變體的多種嵌套方式

enum Message {
    Quit,
    Move {x:i32,y:u32},
    Write(String),
    ChangeColor(i32,i32,i32)
}

fn main() {
    let q=Message::Quit;
    let m=Message::Move { x: 6, y: 12 };
    let w=Message::Write(String::from("hello_world"));
    let c=Message::ChangeColor(255, 255, 0);
}

在這段代碼中枚舉類變體一共有四種數(shù)據(jù)類型:

  • 不帶關(guān)聯(lián)數(shù)據(jù)Quit
  • 匿名結(jié)構(gòu)體Move
  • 字符串類型Write
  • 匿名元組結(jié)構(gòu)體ChangeColor

1.4、定義枚舉方法

和結(jié)構(gòu)體方法類似,使用impl關(guān)鍵字:

impl Message{
	fn call(&self){}
}

這里就不具體實(shí)現(xiàn)了,此時(shí)枚舉的所有變體都可以調(diào)用call方法,例如q.call();

2、Option枚舉

2.1、引入Option枚舉解決控制問(wèn)題

  • OptionRust 標(biāo)準(zhǔn)庫(kù)中的枚舉類,這個(gè)類用于填補(bǔ) Rust 不支持 null 引用的空白。
  • 許多語(yǔ)言支持 null 的存在(C/C++、Java),這樣很方便,但也制造了極大的問(wèn)題,null 的發(fā)明者也承認(rèn)這一點(diǎn),“一個(gè)方便的想法造成累計(jì) 10 億美元的損失”
  • null 經(jīng)常在開發(fā)者把一切都當(dāng)作不是 null 的時(shí)候給予程序致命一擊:畢竟只要出現(xiàn)一個(gè)這樣的錯(cuò)誤,程序的運(yùn)行就要徹底終止
  • 為了解決這個(gè)問(wèn)題,很多語(yǔ)言默認(rèn)不允許 null,但在語(yǔ)言層面支持 null 的出現(xiàn)(常在類型前面用 ? 符號(hào)修飾)。
  • Java 默認(rèn)支持 null,但可以通過(guò) @NotNull 注解限制出現(xiàn) null,這是一種應(yīng)付的辦法。

Rust 在語(yǔ)言層面徹底不允許空值 null 的存在,但無(wú)奈null 可以高效地解決少量的問(wèn)題,所以 Rust 引入了 Option 枚舉類:

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

2.2、枚舉類的具體使用

枚舉類包含在預(yù)導(dǎo)入模塊中(Prelude),可直接使用:

let some_number=Some(5);
let some_string=Some("a string")

let absent:Option<&str>=None;

注意:

  • 編譯器無(wú)法推斷None是什么類型,所以一定要顯示聲明
  • 由于absent屬于None的變體,因此是無(wú)效數(shù)據(jù),也就是null

3、match控制流運(yùn)算符

  • 枚舉的目的是對(duì)某一類事物的分類,分類的目的是為了對(duì)不同的情況進(jìn)行描述。
  • 基于這個(gè)原理,往往枚舉類最終都會(huì)被分支結(jié)構(gòu)處理(許多語(yǔ)言中的 switch )。
  • switch 語(yǔ)法很經(jīng)典,但在 Rust 中并不支持,很多語(yǔ)言摒棄 switch 的原因都是因?yàn)?switch 容易存在因忘記添加 break 而產(chǎn)生的串接運(yùn)行問(wèn)題,Java 和 C# 這類語(yǔ)言通過(guò)安全檢查杜絕這種情況出現(xiàn)。

Rust 通過(guò) match 語(yǔ)句來(lái)實(shí)現(xiàn)分支結(jié)構(gòu)。先認(rèn)識(shí)一下如何用 match 處理枚舉類:

fn main() {
    enum Book {
        Papery {index: u32},
        Electronic {url: String},
    }
   
    let book = Book::Papery{index: 1001};
    let ebook = Book::Electronic{url: String::from("url...")};
   
    match book {
        Book::Papery { index } => {
            println!("Papery book {}", index);
        },
        Book::Electronic { url } => {
            println!("E-book {}", url);
        }
    }
}
//運(yùn)行結(jié)果:Papery book 1001

這是由于book屬于Papery的變體,因此會(huì)執(zhí)行第一個(gè)打印語(yǔ)句

match 塊也可以當(dāng)作函數(shù)表達(dá)式來(lái)對(duì)待,它也是可以有返回值的:

match 枚舉類實(shí)例 {
    分類1 => 返回值表達(dá)式,
    分類2 => 返回值表達(dá)式,
    ...
}

但是要謹(jǐn)記:所有返回值表達(dá)式的類型必須一樣!

如果把枚舉類附加屬性定義成元組,在 match 塊中需要臨時(shí)指定一個(gè)名字:

enum Book {
    Papery(u32),
    Electronic {url: String},
}
let book = Book::Papery(1001);

match book {
    Book::Papery(i) => {
        println!("{}", i);
    },
    Book::Electronic { url } => {
        println!("{}", url);
    }
}

變體Papery指定了i變量,Electronic指定了url

match 除了能夠?qū)γ杜e類進(jìn)行分支選擇以外,還可以對(duì)整數(shù)、浮點(diǎn)數(shù)、字符和字符串切片引用(&str)類型的數(shù)據(jù)進(jìn)行分支選擇。其中,浮點(diǎn)數(shù)類型被分支選擇雖然合法,但不推薦這樣使用,因?yàn)榫葐?wèn)題可能會(huì)導(dǎo)致分支錯(cuò)誤。

對(duì)非枚舉類進(jìn)行分支選擇時(shí)必須注意處理例外情況,即使在例外情況下沒(méi)有任何要做的事。例外情況用下劃線 _ 表示:

fn main() {
    let t = "abc";
    match t {
        "abc" => println!("Yes"),
        _ => {},
    }
}

4、if let 語(yǔ)法

通過(guò)一個(gè)簡(jiǎn)單的流程控制代碼理解此部分知識(shí):

let i = 0;
match i {
    0 => println!("zero"),
    _ => {},
}
//主函數(shù)中運(yùn)行結(jié)果:zero

這段程序的目的是判斷 i 是否是數(shù)字 0,如果是就打印 zero。

那么現(xiàn)在用 if let 語(yǔ)法縮短這段代碼:

let i = 0;
if let 0 = i {
    println!("zero");
}

if let 語(yǔ)法格式如下:

if let 匹配值 = 源變量 {
    語(yǔ)句塊
}
  • 可以在之后添加一個(gè) else 塊來(lái)處理例外情況。

if let 語(yǔ)法可以認(rèn)為是只區(qū)分兩種情況的 match 語(yǔ)句的"語(yǔ)法糖"

在枚舉類中的使用:

fn main() {
    enum Book {
        Papery(u32),
        Electronic(String)
    }
    let book = Book::Electronic(String::from("url"));
    if let Book::Papery(index) = book {
        println!("Papery {}", index);
    } else {
        println!("Not papery book");
    }
}
//運(yùn)行結(jié)果:Not papery book

Rust 枚舉類和模式匹配的知識(shí)就分享到這里了,期待你的鼓勵(lì),這將是我創(chuàng)作的不竭動(dòng)力!

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

相關(guān)文章

  • Rust 配置文件內(nèi)容及使用全面講解

    Rust 配置文件內(nèi)容及使用全面講解

    這篇文章主要為大家介紹了Rust 配置文件內(nèi)容及使用全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Rust?語(yǔ)言println!?宏的格式占位符詳解

    Rust?語(yǔ)言println!?宏的格式占位符詳解

    這篇文章主要介紹了Rust語(yǔ)言的println!宏的格式占位符,這只是格式說(shuō)明符的一部分清單,Rust?的格式化系統(tǒng)非常靈活和強(qiáng)大,支持更多的選項(xiàng)和組合,需要的朋友可以參考下
    2024-03-03
  • Rust之Rhai腳本編程的示例

    Rust之Rhai腳本編程的示例

    文章介紹了如何在Rust中使用Rhai庫(kù)執(zhí)行腳本,包括添加依賴、創(chuàng)建引擎、定義腳本、執(zhí)行腳本并處理結(jié)果,示例展示了如何定義一個(gè)簡(jiǎn)單的函數(shù)并調(diào)用它,輸出問(wèn)候信息
    2025-02-02
  • rust開發(fā)環(huán)境配置詳細(xì)教程

    rust開發(fā)環(huán)境配置詳細(xì)教程

    rust是一門比較新的編程語(yǔ)言,2015年5月15日,Rust編程語(yǔ)言核心團(tuán)隊(duì)正式宣布發(fā)布Rust 1.0版本,這篇文章主要介紹了rust開發(fā)環(huán)境配置 ,需要的朋友可以參考下
    2022-12-12
  • Rust動(dòng)態(tài)數(shù)組Vec基本概念及用法

    Rust動(dòng)態(tài)數(shù)組Vec基本概念及用法

    Rust中的Vec是一種動(dòng)態(tài)數(shù)組,它可以在運(yùn)行時(shí)自動(dòng)調(diào)整大小,本文主要介紹了Rust動(dòng)態(tài)數(shù)組Vec基本概念及用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 從入門到精通詳解Rust錯(cuò)誤處理完全指南

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

    這篇文章主要為大家詳細(xì)介紹了Rust中錯(cuò)誤處理的相關(guān)方法和技巧,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一
    2025-12-12
  • Rust語(yǔ)言之trait中的個(gè)方法可以重寫嗎

    Rust語(yǔ)言之trait中的個(gè)方法可以重寫嗎

    在Rust中,trait定義了一組方法,這些方法可以被一個(gè)或多個(gè)類型實(shí)現(xiàn),當(dāng)你為某個(gè)類型實(shí)現(xiàn)一個(gè)trait時(shí),你可以為該trait中的每個(gè)方法提供自己的具體實(shí)現(xiàn),本文將給大家介紹一下trait中的個(gè)方法是否可以重寫,需要的朋友可以參考下
    2023-10-10
  • Rust字符串深度解析String與str的問(wèn)題小結(jié)

    Rust字符串深度解析String與str的問(wèn)題小結(jié)

    在Rust編程語(yǔ)言中,字符串處理是一個(gè)核心概念,但與其他語(yǔ)言不同的是,Rust提供了兩種主要的字符串類型:String和&str,本文介紹Rust字符串深度解析String與str的問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制完整代碼

    Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制完整代碼

    在 Rust 中,如果想為enum實(shí)現(xiàn)一個(gè)帶多參數(shù)的 Hook 機(jī)制,可以結(jié)合模式匹配和枚舉來(lái)處理,這種方式可以擴(kuò)展到支持不同類型的輸入?yún)?shù)和邏輯處理,下面通過(guò)示例代碼介紹Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制,感興趣的朋友一起看看吧
    2024-12-12
  • Rust 通過(guò)異步實(shí)現(xiàn)并發(fā)的方法示例

    Rust 通過(guò)異步實(shí)現(xiàn)并發(fā)的方法示例

    本文主要介紹了Rust 通過(guò)異步實(shí)現(xiàn)并發(fā)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06

最新評(píng)論

临漳县| 大石桥市| 平遥县| 金堂县| 来宾市| 鹿泉市| 西峡县| 祁东县| 长宁县| 宜章县| 清远市| 兴山县| 霞浦县| 兰溪市| 巴林右旗| 莆田市| 濮阳县| 枞阳县| 镇江市| 阿拉尔市| 霍州市| 泽普县| 昆明市| 会理县| 宜兴市| 噶尔县| 宁南县| 华安县| 苗栗县| 潼关县| 株洲县| 九台市| 大英县| 丹东市| 普格县| 阳曲县| 石门县| 蒲城县| 沁源县| 开平市| 读书|