精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一起聊聊在Rust中使用枚舉表示狀態(tài)

開發(fā) 前端
Rust中的枚舉比大多數(shù)其他語言更強大。它們可以用來優(yōu)雅地表示狀態(tài)轉(zhuǎn)換——甚至可以跨越語言邊界。

許多具有系統(tǒng)編程背景的Rust初學者傾向于使用bool(甚至u8—8位無符號整數(shù)類型)來表示“狀態(tài)”。

例如,如何使用bool來指示用戶是否處于活動狀態(tài)?

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

一開始,這可能看起來不錯,但是隨著代碼庫的增長,會發(fā)現(xiàn)“active”不是二進制狀態(tài)。用戶可以處于許多不同的狀態(tài),用戶可能被掛起或刪除。但是,擴展User結(jié)構(gòu)體可能會出現(xiàn)問題,因為代碼的其他部分有可能依賴active是bool類型。

另一個問題是bool不是自文檔化的。active = false是什么意思?用戶是否處于非活動狀態(tài),或者用戶被刪除了,或者用戶被掛起了?我們不知道!

或者,可以使用一個無符號整數(shù)來表示狀態(tài):

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

這稍微好一點,因為我們現(xiàn)在可以使用不同的值來表示更多的狀態(tài):

const ACTIVE: u8 = 0;
const INACTIVE: u8 = 1;
const SUSPENDED: u8 = 2;
const DELETED: u8 = 3;

let user = User {
    // ...
    status: ACTIVE,
};

u8的一個常見用例是與C代碼交互,在這種情況下,使用u8似乎是唯一的選擇。我們還可以將u8包裝在一個新類型中!

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

這樣我們就可以在UserStatus上定義方法:

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

我們甚至還可以定義一個構(gòu)造函數(shù)來驗證輸入:

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"),
        }
    }
}

使用枚舉表示狀態(tài)

枚舉是為域內(nèi)的狀態(tài)建模的好方法。它們以一種非常簡潔的方式表達你的意圖。

#[derive(Debug)]
pub enum UserStatus {
    /// 用戶是活躍的,可以完全訪問他們的帳戶和任何相關(guān)功能。
    Active,

    /// 用戶的帳戶處于非活動狀態(tài)。該狀態(tài)可由用戶或管理員恢復(fù)為激活狀態(tài)。
    Inactive,

     /// 該用戶的帳戶已被暫時暫停,可能是由于可疑活動或違反政策。
    /// 在此狀態(tài)下,用戶無法訪問其帳戶,并且可能需要管理員的干預(yù)才能恢復(fù)帳戶。
    Suspended,

    /// 該用戶的帳號已被永久刪除,無法恢復(fù)。
    /// 與該帳戶關(guān)聯(lián)的所有數(shù)據(jù)都可能被刪除,用戶需要創(chuàng)建一個新帳戶才能再次使用該服務(wù)。
    Deleted,
}

我們可以將這個枚舉插入到User結(jié)構(gòu)體中:

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

但這還不是全部。在Rust中,枚舉比許多其他語言強大得多。例如,可以向枚舉變量中添加數(shù)據(jù):

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

我們還可以表示狀態(tài)轉(zhuǎn)換:

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 {
            // 已經(jīng)刪除,不要再設(shè)置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());
    }
}

看看我們僅僅用幾行代碼就涵蓋了多少內(nèi)容!我們可以放心地擴展應(yīng)用程序,因為我們知道不會意外地刪除用戶兩次或重新激活已刪除的用戶。非法的狀態(tài)轉(zhuǎn)換現(xiàn)在是不可能的!

使用枚舉與C代碼交互

C代碼:

typedef struct {
    uint8_t status;
} User;

User *create_user(uint8_t status);

你可以寫一個Rust枚舉來表示狀態(tài):

#[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(()),
        }
    }
}

注意到#[repr(u8)]屬性了嗎?它告訴編譯器將此枚舉表示為無符號8位整數(shù)。這對于與C代碼的兼容性至關(guān)重要。

現(xiàn)在,讓我們用一個安全的Rust包裝器包裝C函數(shù):

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

Rust代碼現(xiàn)在使用豐富的enum類型與C代碼通信。

總結(jié)

Rust中的枚舉比大多數(shù)其他語言更強大。它們可以用來優(yōu)雅地表示狀態(tài)轉(zhuǎn)換——甚至可以跨越語言邊界。

責任編輯:武曉燕 來源: coding到燈火闌珊
相關(guān)推薦

2024-01-02 09:09:03

枚舉規(guī)范化管理

2023-10-31 14:04:17

Rust類型編譯器

2021-09-11 19:02:34

Hook使用版本

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-06-30 08:18:51

敏捷開發(fā)模式

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-09-10 21:42:31

2023-09-21 08:16:56

JDK 21向量計算計算

2024-02-20 21:34:16

循環(huán)GolangGo

2022-12-07 09:01:14

布局容器VStack?

2021-08-27 07:06:10

IOJava抽象

2021-07-12 11:35:13

Go協(xié)程Goroutine

2024-07-18 08:54:49

2024-07-26 09:47:28

2022-10-08 00:00:05

SQL機制結(jié)構(gòu)

2022-02-23 08:41:58

NATIPv4IPv6

2022-09-22 08:06:29

計算機平板微信

2024-11-28 09:57:50

C#事件發(fā)布器

2021-08-12 07:49:24

mysql
點贊
收藏

51CTO技術(shù)棧公眾號

99久久九九| av片在线观看| 午夜亚洲伦理| 日韩成人在线电影网| 日韩精品 欧美| 精品人妻一区二区三区蜜桃| 狠狠色丁香婷婷综合影院| 欧美四级电影网| 日本高清xxxx| 无码精品视频一区二区三区 | 亚洲色图27p| 精品一区二区三区在线观看视频| 日韩一区二区在线| 精品一区二区三区在线播放视频 | 亚洲综合大片69999| 久久久久无码国产精品| 97久久综合区小说区图片区| 亚洲一区二区欧美日韩| 九色91在线视频| 中文字幕日日夜夜| 亚洲精彩视频| 亚洲欧美日韩国产中文| 日韩中文字幕a| 伊人电影在线观看| 久久久精品人体av艺术| 国产精品高潮呻吟久久av野狼| a级大片在线观看| 电影91久久久| 91电影在线观看| 成人高清dvd| 日本中文字幕一区二区有码在线 | 91精品国产色综合| 男人天堂av电影| 亚洲精品a区| 欧美在线|欧美| a级黄色片免费| 午夜在线视频免费| 久久国产剧场电影| 欧美壮男野外gaytube| 欧美日韩三级在线观看| 日韩久久精品| 精品视频在线观看日韩| 欧美老女人bb| 色婷婷成人网| 在线观看日韩精品| 日韩av资源在线| 国产桃色电影在线播放| 亚洲欧美日韩国产综合| 欧美日韩在线一二三| 老牛影视av牛牛影视av| 视频一区二区三区在线看免费看| 亚洲人体大胆视频| 精品久久久91| 成人免费视频入口| 九色精品国产蝌蚪| 日韩av最新在线观看| 免费欧美一级片| 亚洲精品乱码日韩| 欧美最猛黑人xxxxx猛交| cao在线观看| 无遮挡动作视频在线观看免费入口| www国产亚洲精品久久麻豆| 国产尤物91| 亚洲乱色熟女一区二区三区| 国产福利一区二区| 91牛牛免费视频| 亚洲香蕉在线视频| 免费一级欧美片在线观看| 国产99久久久欧美黑人| 天天操天天操天天操天天| 9久re热视频在线精品| 欧美福利视频在线观看| 成熟的女同志hd| 91成人网在线观看| 大胆欧美人体视频| 男女性高潮免费网站| 亚洲欧美综合久久久| 日韩有码在线播放| 小早川怜子一区二区的演员表| 国产精品入口久久| 伊人久久久久久久久久久久久| 国产人妻大战黑人20p| 国产一区二区三区电影在线观看 | www.看毛片| 成人做爰69片免费看网站| 成人免费视频视频在| 亚洲国产福利视频| 北条麻妃国产九九精品视频| 久久99国产精品99久久| 你懂的视频在线播放| 久久精品男人的天堂| 日本欧美精品久久久| 国产露出视频在线观看| 成人免费网址| 91婷婷韩国欧美一区二区| 久中文字幕一区| av影片在线看| 国产精品色哟哟网站| 亚洲一区bb| 日本孕妇大胆孕交无码| 黄色精品在线看| 免费大片在线观看| 日韩伦理一区二区| 精品国产sm最大网站| 一级性生活大片| 日韩午夜电影网| 欧美激情一区二区三区久久久| 日韩欧美视频在线免费观看| 丝袜美腿亚洲色图| 亚洲综合色av| 午夜视频在线免费播放| 国产精品乱人伦中文| 国产精品videossex国产高清| 性欧美18xxxhd| 欧美日韩一区高清| 理论片大全免费理伦片| 国内黄色精品| 久久6精品影院| 国产午夜福利片| 欧美bbbbb| 福利视频一区二区三区| 成人亚洲综合天堂| 亚洲国产精品久久久男人的天堂| 五月婷婷狠狠操| 风间由美一区二区av101| 国产一区二区三区四区福利| 欧美高清视频一区二区三区| 日本成人中文字幕在线视频| 国产精品swag| 成人影欧美片| 色综合天天综合在线视频| 91视频免费版污| 国产精品久久久久久久久久白浆| 一区二区三区四区精品| 日韩中文不卡| 国产免费不卡av| 久久精品免费在线观看| 青青青青草视频| av日韩一区| 在线视频免费一区二区| 黄色片免费观看视频| 国产精品一级黄| 四虎影院一区二区三区 | 国产精品欧美综合在线| 女人和拘做爰正片视频| 第一区第二区在线| 美女精品久久久| 中文字幕免费在线看| 91在线视频播放地址| 国产成人艳妇aa视频在线| 日韩电影免费观看高清完整版在线观看| 亚洲国产精品999| 91狠狠综合久久久久久| 日韩精品电影在线| 久久精品国产精品青草色艺| 乱插在线www| 欧美日韩三级在线| 久久亚洲AV成人无码国产野外| 红桃视频亚洲| 国产成人看片| 欧美wwww| 亚洲精品一区二区三区影院| 久久国产一级片| 国产乱妇无码大片在线观看| 亚洲欧洲另类精品久久综合| 性爽视频在线| 亚洲成人xxx| 日韩欧美不卡视频| www..com久久爱| 日韩免费一级视频| 久久影院资源站| 97国产精品人人爽人人做| 免费国产精品视频| 亚洲成av人影院在线观看网| 完美搭档在线观看| 夜夜嗨一区二区三区| 精品久久久国产| 青青草成人免费在线视频| av成人综合| 97av在线播放| 欧美zzoo| 欧美日韩另类一区| 精品国产视频一区二区三区| 国产精品小仙女| 欧美日韩不卡在线视频| 老汉色老汉首页av亚洲| 51精品国产黑色丝袜高跟鞋| 加勒比一区二区三区在线| 欧美三级日韩在线| 日韩在线视频网址| 岛国av在线一区| 亚洲国产精品久久久久爰色欲| 女人抽搐喷水高潮国产精品| 91精品国产色综合| av在线免费观看网| 日韩欧美一二三四区| 日产精品久久久久久久| 久久九九国产精品| 色噜噜狠狠一区二区三区狼国成人 | 欧美丝袜丝交足nylons| 女性裸体视频网站| 国产盗摄一区二区三区| 免费国产黄色网址| 国产成人1区| 成人网在线免费看| 91色在线看| 永久免费毛片在线播放不卡| 国产精品久久久久久久久久久久久久久久 | 91精品天堂福利在线观看| 成人免费视频网站| 精品极品在线| 丝袜一区二区三区| 日本黄色一区二区三区| 欧美日韩精品一区二区三区四区| 欧美成人精品欧美一| 久久久久久97三级| 黑人无套内谢中国美女| 欧美三级精品| 欧美日韩性生活| 久久久综合久久| 国产午夜精品一区二区三区视频| 一级网站在线观看| 久久久久久一区二区| 成年丰满熟妇午夜免费视频| 日韩三级毛片| 亚洲在线免费看| 韩国成人在线| 97久久久久久| 91网在线看| 伊人伊人伊人久久| 五月天婷婷社区| 日韩午夜激情电影| 在线观看黄色国产| 欧美视频在线免费| 精品一区在线视频| 国产精品麻豆欧美日韩ww| 泷泽萝拉在线播放| 麻豆91精品视频| 国产日韩一区二区在线观看| 国精品一区二区| 中文字幕成人一区| 精品国产一区二区三区av片| 国内成+人亚洲| 久久在线观看| 91精品久久久久久久久久久| 成人在线视频播放| 午夜精品久久久久久久久久久久久| 1024免费在线视频| 国产午夜精品视频| 麻豆国产在线播放| 日韩毛片在线观看| 日韩国产福利| 日韩精品亚洲元码| 少妇一级淫片免费看| 精品国产伦一区二区三区观看体验| 国产三级视频在线播放| 在线观看91av| 国产精品久久久久久久免费 | 国产a久久麻豆| 欧美国产日韩在线视频| 久久精品99国产国产精| 一区二区三区入口| 奇米色一区二区| 尤蜜粉嫩av国产一区二区三区| 肉肉av福利一精品导航| 日韩一级在线免费观看| 亚洲国产精品欧美久久| 国产精品女同一区二区三区| 谁有免费的黄色网址| 国产婷婷色一区二区三区在线| 自拍偷拍视频亚洲| 欧美国产欧美综合| 无码人中文字幕| 亚洲丝袜美腿综合| 天天干天天操天天拍| 中文字幕国产一区| 午夜国产福利视频| 亚洲品质自拍视频网站| 久久精品第一页| 亚洲成av人片| 亚洲永久精品在线观看| 91成人免费在线| 91精品视频免费在线观看| 91精品综合久久久久久| 国产精品无码在线播放| 欧美电影一区二区| www.五月婷| 精品视频在线播放色网色视频| 欧美成人免费| www.亚洲成人| 成人福利电影| 国产成人福利网站| 日韩毛片网站| 国产精品久久久久久久小唯西川| 国产精品nxnn| 欧美亚洲另类在线一区二区三区| 日韩精品久久| 欧美激情亚洲天堂| 欧美亚洲网站| 不卡中文字幕在线观看| 不卡视频一二三| 四虎成人免费影院| 亚洲综合在线第一页| 日本熟女毛茸茸| 91精品国产色综合久久不卡蜜臀| 国产欧美日韩综合精品一区二区三区| 欧美精品在线视频| 亚洲第一页在线观看| 亚洲视频网站在线观看| 污视频在线免费观看网站| 日本成人在线视频网址| 精品一区二区三区视频在线播放| 玛丽玛丽电影原版免费观看1977 | 一卡二卡三卡四卡五卡| 99久久精品国产一区二区三区| 国产精品视频专区| 欧产日产国产精品视频| 国产精自产拍久久久久久蜜| 女人抽搐喷水高潮国产精品| 不卡中文字幕在线| 99精品免费视频| www.日本久久| 国产欧美综合在线观看第十页| 国产亚洲精品久久久久久打不开 | 国产四区在线观看| 毛片一区二区| 无码人妻一区二区三区在线| 中文字幕av一区二区三区高| 亚洲免费在线观看av| 欧美日韩国产一级| 人妻中文字幕一区| 久久亚洲精品一区| 欧美日一区二区三区| 国产一区二区视频在线免费观看 | 亚洲免费av网| 丝瓜av网站精品一区二区| 不许穿内裤随时挨c调教h苏绵| 91色婷婷久久久久合中文| 欧美日韩成人免费观看| 欧美乱妇15p| seseavlu视频在线| 欧美在线视频一区| 欧美绝顶高潮抽搐喷水合集| 狠狠噜天天噜日日噜| 日本不卡高清视频| 久久性爱视频网站| 综合国产在线视频| 手机免费av片| 成人av免费在线观看| 女人黄色一级片| 一本久久精品一区二区| 丰满人妻一区二区三区免费| 美日韩在线视频| 成人日韩视频| 中文字幕制服丝袜在线| 久色婷婷小香蕉久久| 欧美激情 一区| 欧美色成人综合| 国产精品va在线观看视色 | 午夜两性免费视频| 亚洲国产精品传媒在线观看| 精品视频一二三区| 亚洲欧美在线看| 日韩三区免费| 亚洲精品白虎| 国产在线精品不卡| 久久久久久久久久99| 亚洲精品www| 欧美理论影院| 日韩影片在线播放| 精品影院一区二区久久久| 国产精品白嫩白嫩大学美女| 不卡欧美aaaaa| 亚洲性生活网站| 久久久五月婷婷| 一区二区三区亚洲视频| 久久精品免费播放| 国产成人tv| 激情五月亚洲色图| 亚洲色图在线播放| 色婷婷av一区二区三区之红樱桃 | 青娱乐国产精品| 亚洲国产精品资源| 自拍偷自拍亚洲精品被多人伦好爽| 日韩美女一区| 国产高清精品在线| 精品国产一区二区三区四| 日韩中文在线观看| 成人福利一区| 欧美成人黄色网址| 一区二区成人在线观看| 欧美女同网站| 2019国产精品视频| 欧美一区=区| 成人在线观看免费完整| 亚洲欧美成人在线| 国产精久久一区二区| 女人扒开屁股爽桶30分钟| 最近日韩中文字幕| 青青草av免费在线观看|