日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一起聊聊在Rust中使用枚舉表示狀態

來源: 責編: 時間:2024-04-07 17:05:54 236觀看
導讀許多具有系統編程背景的Rust初學者傾向于使用bool(甚至u8—8位無符號整數類型)來表示“狀態”。例如,如何使用bool來指示用戶是否處于活動狀態?struct User { // ... active: bool,}一開始,這可能看起來不錯,但是隨

許多具有系統編程背景的Rust初學者傾向于使用bool(甚至u8—8位無符號整數類型)來表示“狀態”。WrY28資訊網——每日最新資訊28at.com

例如,如何使用bool來指示用戶是否處于活動狀態?WrY28資訊網——每日最新資訊28at.com

struct User {    // ...    active: bool,}

WrY28資訊網——每日最新資訊28at.com

一開始,這可能看起來不錯,但是隨著代碼庫的增長,會發現“active”不是二進制狀態。用戶可以處于許多不同的狀態,用戶可能被掛起或刪除。但是,擴展User結構體可能會出現問題,因為代碼的其他部分有可能依賴active是bool類型。WrY28資訊網——每日最新資訊28at.com

另一個問題是bool不是自文檔化的。active = false是什么意思?用戶是否處于非活動狀態,或者用戶被刪除了,或者用戶被掛起了?我們不知道!WrY28資訊網——每日最新資訊28at.com

或者,可以使用一個無符號整數來表示狀態:WrY28資訊網——每日最新資訊28at.com

struct User {    // ...    status: u8,}

WrY28資訊網——每日最新資訊28at.com

這稍微好一點,因為我們現在可以使用不同的值來表示更多的狀態:WrY28資訊網——每日最新資訊28at.com

const ACTIVE: u8 = 0;const INACTIVE: u8 = 1;const SUSPENDED: u8 = 2;const DELETED: u8 = 3;let user = User {    // ...    status: ACTIVE,};

WrY28資訊網——每日最新資訊28at.com

u8的一個常見用例是與C代碼交互,在這種情況下,使用u8似乎是唯一的選擇。我們還可以將u8包裝在一個新類型中!WrY28資訊網——每日最新資訊28at.com

struct User {    // ...    status: UserStatus,}struct UserStatus(u8);const ACTIVE: UserStatus = UserStatus(0);const INACTIVE: UserStatus = UserStatus(1);const SUSPENDED: UserStatus = UserStatus(2);const DELETED: UserStatus = UserStatus(3);let user = User {    // ...    status: ACTIVE,};

WrY28資訊網——每日最新資訊28at.com

這樣我們就可以在UserStatus上定義方法:WrY28資訊網——每日最新資訊28at.com

impl UserStatus {    fn is_active(&self) -> bool {        self.0 == ACTIVE.0    }}

WrY28資訊網——每日最新資訊28at.com

我們甚至還可以定義一個構造函數來驗證輸入:WrY28資訊網——每日最新資訊28at.com

impl UserStatus {    fn new(status: u8) -> Result<Self, &'static str> {        match status {            ACTIVE.0 => Ok(ACTIVE),            INACTIVE.0 => Ok(INACTIVE),            SUSPENDED.0 => Ok(SUSPENDED),            DELETED.0 => Ok(DELETED),            _ => Err("Invalid status"),        }    }}

WrY28資訊網——每日最新資訊28at.com

WrY28資訊網——每日最新資訊28at.com

使用枚舉表示狀態

WrY28資訊網——每日最新資訊28at.com

枚舉是為域內的狀態建模的好方法。它們以一種非常簡潔的方式表達你的意圖。WrY28資訊網——每日最新資訊28at.com

#[derive(Debug)]pub enum UserStatus {    /// 用戶是活躍的,可以完全訪問他們的帳戶和任何相關功能。    Active,    /// 用戶的帳戶處于非活動狀態。該狀態可由用戶或管理員恢復為激活狀態。    Inactive,     /// 該用戶的帳戶已被暫時暫停,可能是由于可疑活動或違反政策。    /// 在此狀態下,用戶無法訪問其帳戶,并且可能需要管理員的干預才能恢復帳戶。    Suspended,    /// 該用戶的帳號已被永久刪除,無法恢復。    /// 與該帳戶關聯的所有數據都可能被刪除,用戶需要創建一個新帳戶才能再次使用該服務。    Deleted,}

WrY28資訊網——每日最新資訊28at.com

我們可以將這個枚舉插入到User結構體中:WrY28資訊網——每日最新資訊28at.com

struct User {    // ...    status: UserStatus,}

WrY28資訊網——每日最新資訊28at.com

但這還不是全部。在Rust中,枚舉比許多其他語言強大得多。例如,可以向枚舉變量中添加數據:WrY28資訊網——每日最新資訊28at.com

#[derive(Debug)]pub enum UserStatus {    Active,    Inactive,    Suspended { until: DateTime<Utc> },    Deleted { deleted_at: DateTime<Utc> },}

WrY28資訊網——每日最新資訊28at.com

我們還可以表示狀態轉換:WrY28資訊網——每日最新資訊28at.com

use chrono::{DateTime, Utc};#[derive(Debug)]pub enum UserStatus {    Active,    Inactive,    Suspended { until: DateTime<Utc> },    Deleted { deleted_at: DateTime<Utc> },}impl UserStatus {    /// 暫停用戶直到指定日期    fn suspend(&mut self, until: DateTime<Utc>) {        match self {            UserStatus::Active => *self = UserStatus::Suspended { until },            _ => {}        }    }    /// 激活用戶    fn activate(&mut self) -> Result<(), &'static str> {        match self {            // A deleted user can't be activated!            UserStatus::Deleted { .. } => return Err("can't activate a deleted user"),            _ => *self = UserStatus::Active        }        Ok(())    }    /// 刪除用戶,這是一個永久的動作!    fn delete(&mut self) {        if let UserStatus::Deleted { .. } = self {            // 已經刪除,不要再設置deleted_at字段。            return;        }        *self = UserStatus::Deleted {            deleted_at: Utc::now(),        }    }    fn is_active(&self) -> bool {        matches!(self, UserStatus::Active)    }    fn is_suspended(&self) -> bool {        matches!(self, UserStatus::Suspended { .. })    }    fn is_deleted(&self) -> bool {        matches!(self, UserStatus::Deleted { .. })    }}#[cfg(test)]mod tests {    use chrono::Duration;    use super::*;    #[test]    fn test_user_status() -> Result<(), &'static str>{        let mut status = UserStatus::Active;        assert!(status.is_active());        // 暫停到明天        status.suspend(Utc::now() + Duration::days(1));        assert!(status.is_suspended());        status.activate()?;        assert!(status.is_active());        status.delete();        assert!(status.is_deleted());        Ok(())    }    #[test]    fn test_user_status_transition() {        let mut status = UserStatus::Active;        assert!(status.is_active());        status.delete();        assert!(status.is_deleted());        // 無法激活已刪除的用戶        assert!(status.activate().is_err());    }}

WrY28資訊網——每日最新資訊28at.com

看看我們僅僅用幾行代碼就涵蓋了多少內容!我們可以放心地擴展應用程序,因為我們知道不會意外地刪除用戶兩次或重新激活已刪除的用戶。非法的狀態轉換現在是不可能的!WrY28資訊網——每日最新資訊28at.com

WrY28資訊網——每日最新資訊28at.com

WrY28資訊網——每日最新資訊28at.com

使用枚舉與C代碼交互

C代碼:WrY28資訊網——每日最新資訊28at.com

typedef struct {    uint8_t status;} User;User *create_user(uint8_t status);

WrY28資訊網——每日最新資訊28at.com

你可以寫一個Rust枚舉來表示狀態:WrY28資訊網——每日最新資訊28at.com

#[repr(u8)]#[derive(Debug, PartialEq)]pub enum UserStatus {    Active = 0,    Inactive,    Suspended,    Deleted,}impl TryFrom<u8> for UserStatus {    type Error = ();    fn try_from(value: u8) -> Result<Self, Self::Error> {        match value {            0 => Ok(UserStatus::Active),            1 => Ok(UserStatus::Inactive),            2 => Ok(UserStatus::Suspended),            3 => Ok(UserStatus::Deleted),            _ => Err(()),        }    }}

WrY28資訊網——每日最新資訊28at.com

注意到#[repr(u8)]屬性了嗎?它告訴編譯器將此枚舉表示為無符號8位整數。這對于與C代碼的兼容性至關重要。WrY28資訊網——每日最新資訊28at.com

現在,讓我們用一個安全的Rust包裝器包裝C函數:WrY28資訊網——每日最新資訊28at.com

extern "C" {    fn create_user(status: u8) -> *mut User;}pub fn create_user_wrapper(status: UserStatus) -> Result<User, &'static str> {    let user = unsafe { create_user(status as u8) };    if user.is_null() {        Err("Failed to create user")    } else {        Ok(unsafe { *Box::from_raw(user) })    }}

WrY28資訊網——每日最新資訊28at.com

Rust代碼現在使用豐富的enum類型與C代碼通信。WrY28資訊網——每日最新資訊28at.com

WrY28資訊網——每日最新資訊28at.com

WrY28資訊網——每日最新資訊28at.com

總結

Rust中的枚舉比大多數其他語言更強大。它們可以用來優雅地表示狀態轉換——甚至可以跨越語言邊界。WrY28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-81736-0.html一起聊聊在Rust中使用枚舉表示狀態

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 探索并發安全的Go語言Map - 深入理解Cmap

下一篇: 你有思考過@Transactional事務是真的好用嗎?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美老女人xx| 久久精品一区二区| 夜夜爽av福利精品导航| 一区二区精品在线| 亚欧美中日韩视频| 久久中文字幕一区二区三区| 欧美夫妇交换俱乐部在线观看| 欧美日韩成人激情| 国产精品久久久久毛片软件 | 亚洲人成艺术| 中文亚洲免费| 久久久久国产精品人| 欧美精品一区二区久久婷婷| 欧美日韩国产系列| 国产一区二区三区黄| 亚洲人成人一区二区三区| 一区二区三区波多野结衣在线观看| 午夜精品久久久久久99热软件| 久久综合五月天婷婷伊人| 欧美日韩一区综合| 极品尤物久久久av免费看| 一区二区成人精品 | 国产精品久久久久9999| 国内成人精品视频| 一区二区精品在线观看| 久久天天躁狠狠躁夜夜av| 欧美日韩免费一区| 在线观看91精品国产入口| 午夜精品剧场| 欧美了一区在线观看| 国产亚洲一本大道中文在线| 日韩视频免费大全中文字幕| 久久久久久久国产| 国产精品免费看| 亚洲激情午夜| 久久精品国产亚洲一区二区| 欧美日韩一区二区三区视频| 一区二区三区在线观看视频| 亚洲免费视频中文字幕| 欧美极品影院| 亚洲国产精品va在看黑人| 欧美在线免费视频| 国产精品高潮呻吟久久av黑人| 亚洲国产高清在线| 久久成人在线| 国产精品一区二区在线| 一本色道久久综合精品竹菊| 欧美成人a视频| 精品不卡视频| 欧美诱惑福利视频| 国产精品一页| 亚洲少妇自拍| 欧美激情视频一区二区三区在线播放| 国语自产精品视频在线看8查询8| 亚洲欧美变态国产另类| 欧美日韩一二三四五区| 亚洲精品免费一区二区三区| 麻豆国产精品一区二区三区| 国内精品久久久久影院优| 欧美在线免费观看视频| 国产精品一区在线播放| 亚洲一区二区三区精品动漫| 欧美日本在线观看| 亚洲激情专区| 欧美mv日韩mv亚洲| 欧美乱妇高清无乱码| 久久精品综合一区| 亚洲欧美日韩精品在线| 欧美日韩精品二区| 欧美—级a级欧美特级ar全黄| 欧美日精品一区视频| 亚洲国产黄色片| 欧美视频在线观看视频极品| 欧美激情中文不卡| 欧美一级理论性理论a| 夜夜嗨av一区二区三区网页| 亚洲一区二区三| 久久成人资源| 欧美精品电影| 欧美www在线| 欧美激情精品久久久| 欧美久久久久中文字幕| 国模套图日韩精品一区二区| 亚洲精品国产精品久久清纯直播| 国产欧美一区二区精品忘忧草 | 久久精品一区二区三区不卡牛牛| 亚洲大胆视频| 国产精品国产a级| 国产精品国产a| 欧美激情精品久久久久久久变态| 欧美精品成人| 欧美四级电影网站| 国产欧美亚洲精品| 国内视频一区| 国精品一区二区| 在线国产精品一区| 欧美成人一区二区三区| 一个人看的www久久| 麻豆精品在线播放| 国产亚洲一区二区精品| 欧美一级二区| 国内精品久久久久久久97牛牛| 久久精品国内一区二区三区| 在线观看av一区| 欧美激情中文字幕一区二区 | 在线亚洲免费| 国产精品影视天天线| 欧美在线视频免费播放| 黄色精品一区| 欧美精品一区三区| 亚洲网站在线观看| 国产日韩精品一区二区三区 | 欧美在线视频观看免费网站| 亚洲福利视频免费观看| 欧美日韩1区2区3区| 亚洲一区美女视频在线观看免费| 国产精品自拍在线| 久热爱精品视频线路一| 9i看片成人免费高清| 国产精品视频久久一区| 久久久噜久噜久久综合| 亚洲狼人精品一区二区三区| 欧美视频成人| 久久精品一本久久99精品| 亚洲黄色免费| 国产精品久久久久久久久搜平片 | 国产一区在线观看视频| 欧美激情精品久久久久久变态| 日韩亚洲欧美中文三级| 国产农村妇女精品一二区| 免费欧美网站| 亚洲一区二区三区视频| 激情久久久久久久| 欧美三级第一页| 久久久亚洲高清| 亚洲深夜福利视频| 在线观看91精品国产麻豆| 国产精品成人一区二区网站软件| 久久久人成影片一区二区三区观看| 亚洲乱码国产乱码精品精可以看| 国产乱肥老妇国产一区二| 欧美激情一区二区久久久| 欧美一区二区三区在线看 | 亚洲欧美日韩久久精品| 亚洲黄色尤物视频| 国产欧美高清| 欧美日韩国产成人| 久久免费偷拍视频| 亚洲男人的天堂在线| 亚洲国产一区二区三区a毛片| 国产精品看片你懂得| 美日韩精品视频| 性感少妇一区| 一本色道久久综合亚洲精品不卡| 国语自产偷拍精品视频偷 | 国产日韩精品一区二区浪潮av| 欧美精品久久一区二区| 欧美一区二区三区视频免费播放| 99re热这里只有精品免费视频| 激情成人综合| 国产乱码精品一区二区三区忘忧草 | 亚洲激情成人网| 国产一区视频网站| 国产精品视频导航| 欧美日韩系列| 欧美大成色www永久网站婷| 久久国产精品久久久久久电车| 一区二区三区国产精华| 亚洲国产精品视频一区| 国产主播精品| 国产精品亚洲精品| 欧美日韩调教| 欧美成人福利视频| 久久婷婷人人澡人人喊人人爽| 亚洲欧美在线观看| 一本一本久久| 亚洲精品护士| 亚洲国产日韩一区| 在线观看91久久久久久| 国产专区一区| 国产视频自拍一区| 国产精品视频一| 国产精品国产亚洲精品看不卡15 | 欧美日韩dvd在线观看| 欧美激情aaaa| 欧美成人精品在线观看| 久久综合给合久久狠狠色 | 国产欧美精品xxxx另类| 国产精品国产a级| 欧美午夜女人视频在线| 欧美人与性动交a欧美精品| 欧美精品亚洲二区| 欧美国产日韩精品| 欧美电影免费观看高清| 美女国产一区| 免费在线欧美视频| 美国成人直播| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久久久久色| 久久麻豆一区二区| 久久一区二区三区av| 久久久久一区二区三区四区| 久久精品日韩欧美| 久久久91精品国产一区二区三区|