欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

概述

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

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

  • 字面量
  • 解構的數組
  • 枚舉類型
  • 結構體
  • 處理條件表達式
  • 通配符
  • 占位符

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

基礎語法

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

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

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

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

綁定值的模式

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

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

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

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

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),coin將是Coin::Quarter(UsState::Alaska)。這時state綁定的值是UsState::Alaska。然后在pintln!表達式中使用這個綁定就可以獲取Coin枚舉的Quarter成員中內部的州的值。

匹配Option<T>

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

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

通配符和 _ 占位符

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

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函數來使用這個變量。

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

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

改變游戲規(guī)則:現(xiàn)在,當你擲出覺得值不是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() {}

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

相關文章

  • RUST異步流處理方法詳細講解

    RUST異步流處理方法詳細講解

    這篇文章主要介紹了RUST異步流處理方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • rust中間件actix_web在項目中的使用實戰(zhàn)

    rust中間件actix_web在項目中的使用實戰(zhàn)

    這篇文章主要介紹了rust中間件在項目中的使用實戰(zhàn),包括自定義中間件,日志中間件,Default?headers,用戶會話,錯誤處理的用法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Rust?Postgres實例代碼

    Rust?Postgres實例代碼

    Rust Postgres是一個純Rust實現(xiàn)的PostgreSQL客戶端庫,本文主要介紹了Rust?Postgres實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • 詳解在Rust語言中如何聲明可變的static類型變量

    詳解在Rust語言中如何聲明可變的static類型變量

    在Rust中,可以使用lazy_static宏來聲明可變的靜態(tài)變量,lazy_static是一個用于聲明延遲求值靜態(tài)變量的宏,本文將通過一個簡單的例子,演示如何使用?lazy_static?宏來聲明一個可變的靜態(tài)變量,需要的朋友可以參考下
    2023-08-08
  • Rust編寫自動化測試實例權威指南

    Rust編寫自動化測試實例權威指南

    這篇文章主要為大家介紹了Rust編寫自動化測試實例權威指南詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Windows系統(tǒng)下安裝Rust環(huán)境超詳細教程

    Windows系統(tǒng)下安裝Rust環(huán)境超詳細教程

    這篇文章主要介紹了如何在Windows系統(tǒng)上安裝mingw64和Rust,mingw64是一個輕便的C語言編譯環(huán)境,可以替代Rust默認使用的Visual?Studio,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • 深入理解 Rust 中的模式匹配語法(最新推薦)

    深入理解 Rust 中的模式匹配語法(最新推薦)

    Rust中的模式匹配提供了多種方式來處理不同的數據類型和場景,本文給大家介紹Rust 中的模式匹配語法,感興趣的朋友一起看看吧
    2025-03-03
  • 如何基于Rust實現(xiàn)文本搜索minigrep

    如何基于Rust實現(xiàn)文本搜索minigrep

    這篇文章主要介紹了基于Rust實現(xiàn)的文本搜索minigrep,本次演示介紹針對原作者代碼程序的查詢邏輯做了一點點小的優(yōu)化,原程序邏輯的查詢是放在了程序運行的時候,邏輯修改后啟動的時候可以添加參數,也可以啟動后添加,需要的朋友可以參考下
    2024-08-08
  • Rust重載運算符之復數四則運算的實現(xiàn)

    Rust重載運算符之復數四則運算的實現(xiàn)

    這篇文章主要為大家詳細介紹了Rust如何實現(xiàn)復數以及復數的四則運算,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-08-08
  • rust聲明式宏的實現(xiàn)

    rust聲明式宏的實現(xiàn)

    聲明式宏使得你能夠寫出類似?match?表達式的東西,來操作你所提供的?Rust代碼,它使用你提供的代碼來生成用于替換宏調用的代碼,感興趣的可以了解一下
    2023-12-12

最新評論