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

Rust控制流運算符match的用法詳解

 更新時間:2024年01月28日 10:40:46   作者:qq5551230  
match 是Rust中一個極為強大的控制流運算符,用于模式匹配和控制流的選擇,它允許將一個值與一系列的模式相比較,根據(jù)匹配的模式執(zhí)行相應(yīng)代碼,本文給大家詳細介紹了Rust控制流運算符match的用法,需要的朋友可以參考下

概述

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

模式由以下元素(的一些組合)組成:

  • 字面量
  • 解構(gòu)的數(shù)組
  • 枚舉類型
  • 結(jié)構(gòu)體
  • 處理條件表達式
  • 通配符
  • 占位符

我們可以把match表達式想象成某種硬幣分類器:硬幣滑入有著不同大小孔洞的軌道,每個硬幣都會掉入符合它大小的空洞。同樣地,值也會通過match的每一個模式,并且在遇到第一個“符合”的模式時,值會進入相關(guān)的代碼塊并在執(zhí)行中被使用。

基礎(chǔ)語法

match value {
    pattern1 => {
        //code1
    }
    pattern2 => {
        //code2
    }
    _ => {
        //沒有任何匹配
    }
}

基礎(chǔ)語法中,value是要匹配的變量,pattern是匹配模式, => 后面是要執(zhí)行的代碼。末尾使用通配符“ - ”(下劃線)表示其他情況。如果value匹配了某個模式,就執(zhí)行相應(yīng)代碼塊,如果value沒有匹配任何模式,就會執(zhí)行默認的代碼塊,即( _ => {...},)。

讓我們編寫一個函數(shù)來獲取一個未知的硬幣,并以一種類似驗鈔機的方式,確定它時何種硬幣并返回它的美分值。

//一個枚舉和一個以枚舉成員作為模式的match表達式
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,
    }
}

如果分支代碼較短的話通常不使用大括號,如果想要在分支中運行多行代碼,可以使用大括號。

fn value_in_cents(coin:Coin) -> u8 {
    match coin {
        Coin::Penny => {
            println!("Lucy penny!");
            1
        }
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter =>25,
    }
}

綁定值的模式

匹配分支的另一個有用的功能是可以綁定匹配的模式的部分值。也就是可以從枚舉成員中提取值的方式。

舉個例子,讓我們修改枚舉中的一個成員來存放數(shù)據(jù)。1999年到2008年間,美國在25美分的硬幣的一側(cè)為50個州的每一個都印刷了不同的設(shè)計。其他的硬幣都沒有這種區(qū)分州的設(shè)計,只有這些25美分的硬幣有特殊的價值。可以將這些信息加入我們的enum,通過改變Quarter成員來包含一個State值。

//Quarter成員也存放一個UsState值的Coin枚舉
#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
    //--snip--
}
 
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

假設(shè)我們的一個朋友正在嘗試收集所有50個州25美分硬幣。根據(jù)硬幣類型分類零錢的同時,也可以報告出每個25美分硬幣所對應(yīng)的州名稱,如果他沒有的話,他可以將其加入收藏。

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
        }
    }
}

調(diào)用value_in_cents(Coin::Quarter(UsState::Alaska),coin將是Coin::Quarter(UsState::Alaska)。這時state綁定的值是UsState::Alaska。然后在pintln!表達式中使用這個綁定就可以獲取Coin枚舉的Quarter成員中內(nèi)部的州的值。

匹配Option<T>

我們想要編寫一個函數(shù),它獲取一個Option<i32>,如果其中含有一個值,將其加一。如果其中沒有值,函數(shù)應(yīng)該返回None值,二不嘗試執(zhí)行任何操作。

// 一個Option<i32>上使用match表達式的函數(shù)
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);

匹配Some(T)

匹配是窮盡的

Rust知道我們沒有覆蓋所有可能的情況甚至指導(dǎo)哪些模式被忘記了!Rust中的匹配時窮盡的:必須窮舉到最后的可能性來使代碼有效。特別是在Option<T>的例子中,Rust防止我們忘記明確的處理None的情況,這讓我們免于假設(shè)擁有一個實際上為空的值,從而錯誤不可能發(fā)生。

通配符和 _ 占位符

假設(shè)我們正在玩一個游戲,如果你擲出骰子的值為3,角色不會移動,而是會得到一頂新奇的帽子。如果擲出骰子的值為7,你的角色將失去新奇的帽子。對于其他的數(shù)值,你的角色會在棋盤上移動相應(yīng)的格子。

let dice_roll = 9;
match dice_roll {
    3 => add_fancy_hat(),
    7 => remove_fancy_hat(),
    other => move_player(other),
}
 
fn add_fancy_hat() {}
fn remove_fancy_hat() {}
fn move_player(num_spaces: u8) {}

這是一個實現(xiàn)上述邏輯的match,匹配模式是字面值3和7,最后一個分支則涵蓋了所有其他可能的值,模式是我們命名為other的一個變量。other分支的代碼通過將其傳遞給move_player函數(shù)來使用這個變量。

最后一個模式?jīng)]有列出u8所有可能的值,代碼依舊能夠編譯。這種通配模式滿足了match必須被窮盡的要求,必須將通配分支放在最后,因為模式是按順序匹配的。

當(dāng)我們不想使用通配模式獲取的值時,可以使用 _ 模式。這個模式可以匹配任意值而不綁定到該值。

改變游戲規(guī)則:現(xiàn)在,當(dāng)你擲出覺得值不是3或7的時候,你必須再次擲出。這種情況下我們不需要使用這個值。我們修改代碼使用"_"代替變量other:

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

最后一個分支中明確忽略了其他的值,也滿足了窮舉性要求。

改變游戲規(guī)則:如果擲出3或7以外的值,你的回合將無事發(fā)生。使用單元值(空元組)作為_分支的代碼:

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

到此這篇關(guān)于Rust控制流運算符match的用法詳解的文章就介紹到這了,更多相關(guān)Rust控制流運算符match內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust中的Drop特性之解讀自動化資源清理的魔法

    Rust中的Drop特性之解讀自動化資源清理的魔法

    Rust通過Drop特性實現(xiàn)了自動清理機制,確保資源在對象超出作用域時自動釋放,避免了手動管理資源時可能出現(xiàn)的內(nèi)存泄漏或雙重釋放問題,智能指針如Box、Rc和RefCell都依賴于Drop來管理資源,提供了靈活且安全的資源管理方案
    2025-02-02
  • Rust語言數(shù)據(jù)類型的具體使用

    Rust語言數(shù)據(jù)類型的具體使用

    在Rust中,每個值都有一個明確的數(shù)據(jù)類型,本文主要介紹了Rust語言數(shù)據(jù)類型的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Rust 通過異步實現(xiàn)并發(fā)的方法示例

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

    本文主要介紹了Rust 通過異步實現(xiàn)并發(fā)的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • rust交叉編譯問題及報錯解析

    rust交叉編譯問題及報錯解析

    這篇文章主要為大家介紹了rust交叉編譯問題及報錯解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 詳解Rust中三種循環(huán)(loop,while,for)的使用

    詳解Rust中三種循環(huán)(loop,while,for)的使用

    我們常常需要重復(fù)執(zhí)行同一段代碼,針對這種場景,Rust?提供了多種循環(huán)(loop)工具。一個循環(huán)會執(zhí)行循環(huán)體中的代碼直到結(jié)尾,并緊接著回到開頭繼續(xù)執(zhí)行。而?Rust?提供了?3?種循環(huán):loop、while?和?for,下面逐一講解
    2022-09-09
  • Rust中的函數(shù)指針詳解

    Rust中的函數(shù)指針詳解

    Rust是一種現(xiàn)代的系統(tǒng)編程語言,它支持函數(shù)指針。函數(shù)指針是指向函數(shù)的指針,可以將函數(shù)作為參數(shù)傳遞給其他函數(shù)或存儲在變量中。Rust中的函數(shù)指針可以用于實現(xiàn)回調(diào)函數(shù)、動態(tài)分發(fā)和多態(tài)等功能。本文將介紹Rust中的函數(shù)指針的基本用法和高級用法。
    2023-05-05
  • Rust 多線程編程的實現(xiàn)

    Rust 多線程編程的實現(xiàn)

    在rust中,多線程編程不算困難,但是也需要留心和別的編程語言中不同的地方,本文主要介紹了Rust 多線程編程的實現(xiàn),感興趣的可以了解一下
    2023-12-12
  • Rust之模式與模式匹配的實現(xiàn)

    Rust之模式與模式匹配的實現(xiàn)

    Rust中的模式匹配功能強大且靈活,它極大地提高了代碼的表達力和可讀性,本文主要介紹了Rust之模式與模式匹配,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 深入解析Rust中的智能指針

    深入解析Rust中的智能指針

    本文介紹了Rust中的智能指針,Box、Rc、Arc、RefCell、Mutex、RwLock對應(yīng)的功能、場景與常用方法,并提供了組合使用方式,以及Cow、Pin的使用方式,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Rust獲取命令行參數(shù)及IO操作方法

    Rust獲取命令行參數(shù)及IO操作方法

    Rust作為一門系統(tǒng)編程語言,提供了強大且安全的I/O操作支持,本文給大家介紹Rust獲取命令行參數(shù)以及IO操作,感興趣的朋友一起看看吧
    2025-06-06

最新評論

岢岚县| 灌阳县| 广河县| 乐平市| 英德市| 中西区| 锦屏县| 会泽县| 武强县| 黄山市| 通江县| 闽清县| 八宿县| 清丰县| 彰化县| 凭祥市| 东海县| 香格里拉县| 湘潭县| 谷城县| 遂昌县| 珲春市| 武隆县| 涞源县| 如东县| 内丘县| 汝南县| 甘谷县| 阿尔山市| 怀柔区| 那坡县| 土默特右旗| 宜君县| 尤溪县| 原阳县| 安乡县| 辽源市| 海林市| 永昌县| 龙里县| 衡东县|