Rust 数据类型 之 类C枚举 c-like enum

这篇具有很好参考价值的文章主要介绍了Rust 数据类型 之 类C枚举 c-like enum。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Rust 数据类型 之 类C枚举 c-like enum,Rust,rust

目录

枚举类型 enum

定义和声明

例1:Color 枚举

例2:Direction 枚举

例3:Weekday 枚举

类C枚举 C-like

打印输出

强制转成整数

例1:Weekday 枚举

例2:HttpStatus 枚举

例3:Color 枚举

模式匹配

match 表达式

枚举方法


枚举类型 enum

枚举类型是一种用于表示一组有限数量相互关联的离散型数据,这些值可以是不同的整数、字符串或其他类型的对象。枚举体内的元素称作“成员”,rust语言中,枚举里面的成员,都可以被看作是结构体,当然枚举还能嵌套另一个枚举。

定义和声明

在Rust中,枚举类型可以通过关键字enum来定义:

enum MyEnum {
    Variant1,
    Variant2,
    Variant3,
    //...
    VariantN,
}

enum是enumerate/enumeration的缩略词,MyEnum为自定义的枚举名

Variant即变量的意思,有的译作“变体”,我觉得还是沿用C/C++语言中的称呼“成员”比较恰当。

Variant数量N一定有限的,太多的变量堆砌没有意义;而且N>=2,无成员或单个成员也无意义。

通过使用枚举类型,可以为不同的情况定义一组有限的取值。这在需要表示多个可能状态或选项的情况下非常有用。以下是几个常见的枚举类型经典实例:

例1:Color 枚举

Color 枚举表示颜色的不同可能取值,比如红色、绿色和蓝色。

enum Color {
    Red,
    Green,
    Blue,
}

例2:Direction 枚举

Direction 枚举表示方向的不同可能取值,比如上、下、左和右。

enum Direction {
    Up,
    Down,
    Left,
    Right,
}

例3:Weekday 枚举

Weekday 枚举表示一周中的不同天,比如一周7天的枚举。

enum Weekday {
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,    
}

类C枚举 C-like

与C/C++语言中的枚举成员只允许是usigned int型常量,也称枚举常量。Rust中具有C风格的枚举,那么必须满足枚举里面的成员都是单元结构体

打印输出

使用#[derive(Debug)]简化输出,格式:println!("{:?}", MyEnum::VariantN); 

#[derive(Debug)]
enum Number {
    Zero,
    One,
    Two,
    Three,
}

fn main() {
    println!("zero is {:?}", Number::Zero);
    println!("one is {:?}", Number::One);
    println!("Two is {:?}", Number::Two);
    println!("Three is {:?}", Number::Three);
}

输出:

zero is Zero
one is One
Two is Two
Three is Three

强制转成整数

不使用#[derive(Debug)],强制转化为整数后输出

enum Number {
    Zero,
    One,
    Two,
    Three,
}

fn main() {
    println!("zero is {}", Number::Zero as i32);
    println!("one is {}", Number::One as i32);
    println!("Two is {}", Number::Two as i32);
    println!("Three is {}", Number::Three as i32);
}

输出:

zero is 0
one is 1
Two is 2
Three is 3

类C枚举也可以通过赋值运算,变成一组离散的整数:

#![allow(dead_code)]

#[derive(Debug)]
enum Number {
    Zero,
    One,
    Two,
    Five = 5,
    Six,
}

fn main() {
    println!("zero is {}", Number::Zero as i32);
    println!("one is {}", Number::One as i32);
    println!("Five is {}", Number::Five as i32);
    println!("Six is {}", Number::Six as i32);
}

输出:

0
1
5

注:在整个程序中枚举成员Two没被调用过,可以用#![allow(dead_code)]来滤去警告。没有此行,上述程序在编译执行能输出结果,但同时警告:warning: variant `Two` is never constructed。

例1:Weekday 枚举

Weekday 枚举通过赋值,使得星期一到星期日对应整数1~7;而非默认的星期日到星期六对应整数0~6。

#![allow(dead_code)]

enum Weekday {
    Sunday = 7,
    Monday = 1,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
}

fn main() {
    println!("Sunday is {}", Weekday::Sunday as i32);
    println!("Tuesday is {}", Weekday::Tuesday as i32);
    println!("Saturday is {}", Weekday::Saturday as i32);
}

输出:

Sunday is 7
Tuesday is 2
Saturday is 6 

例2:HttpStatus 枚举

HttpStatus 枚举表示不同的 HTTP 状态码,比如200表示成功,404表示找不到页面,500表示服务器内部错误等,共有近百个成员,列举部分如下:

#![allow(dead_code)]

 enum HttpStatus {
    Continue = 100, //"CONTINUE" 继续
    SwitchingProtocols, //"SWITCHING_PROTOCOLS" 切换协议
    Processing, //"PROCESSING" 执行
    Checkpoint, //"CHECKPOINT" 检查点
    OK = 200, //"OK" OK
    CREATED, //"Created" 创建
    ACCEPTED, //"Accepted" 接受
    NonAuthoritativeInformation, //"NON_AUTHORITATIVE_INFORMATION" 非权威信息
    NoContent, //"NO_CONTENT" 没有内容
    ResetContent, //"RESET_CONTENT" 重置内容
    PartialContent, //"PARTIAL_CONTENT" 部分内容
    MultiStatus, //"MULTI_STATUS" 多个状态
    AlreadyReported, //"ALREADY_REPORTED" 已发
    IMUsed = 226, //"IM_USED" 已过时
    MultipleChoices = 300, //"MULTIPLE_CHOICES" 多选择
    MovedPermanently, //"MOVED_PERMANENTLY" 永久移动
    FOUND, //"Found" 找到
    MovedTemporarily, //"MOVED_TEMPORARILY"
    SeeOther, //"SEE_OTHER" 参见其它
    NotModified, //"NOT_MODIFIED" 未修改
    UseProxy, //"USE_PROXY"),
    TemporaryRedirect, //"TEMPORARY_REDIRECT" 暂时重定向
    PermanentRedirect, //"PERMANENT_REDIRECT" 永久重定向
    //......
    BadRequest = 400, //"BAD_REQUEST" 错误请求
    Unauthorized, //"UNAUTHORIZED" 未经授权
    PaymentRequired, //"PAYMENT_REQUIRED" 付费请求
    Forbidden, //"FORBIDDEN" 禁止
    NotFound, //"NOT_FOUND" 未找到
    MethodNotAllowed, //"METHOD_NOT_ALLOWED" 方法不容许
    NotAcceptable, //"NOT_ACCEPTABLE" 方法不接受
    //......
    InternalServerError = 500, // "INTERNAL_SERVER_ERROR" 服务器遇到了意料不到的情况,不能完成客户的请求
    NotImplemented, //"NOT_IMPLEMENTED"  服务器不支持实现请求所需要的功能
    BadGateway, //"BAD_GATEWAY" 从上游服务器接收到无效的响应
    ServiceUnavailable, //"SERVICE_UNAVAILABLE" 服务不可用
    GatewayTimeout, //"GATEWAY_TIMEOUT") 网关不能及时地从远程服务器获得应答
    //......
}

fn main() {
    println!("OK is {}", HttpStatus::OK as i32);
    println!("Bad Request is {}", HttpStatus::BadRequest as i32);
}

输出:

OK is 200
Bad Request is 400

例3:Color 枚举

用{:06x}格式输出6位16进制数表示的颜色

enum Color {
    Red = 0xff0000,
    Green = 0x00ff00,
    Blue = 0x0000ff,
}

fn main() {
    println!("roses are #{:06x}", Color::Red as i32);
    println!("leaves are #{:06x}", Color::Green as i32);
    println!("violets are #{:06x}", Color::Blue as i32);
    println!("red is {}", Color::Red as i32);
    println!("green is {}", Color::Green as i32);
    println!("blue is {}", Color::Blue as i32);
}

输出:

roses are #ff0000
leaves are #00ff00
violets are #0000ff
red is 16711680
green is 65280
blue is 255 

模式匹配

枚举类型在 Rust 中经常与模式匹配(pattern matching)结合使用,以根据枚举类型的值执行不同的操作。

match 表达式

match 表达式可以用于对枚举变体进行模式匹配,并根据所匹配的变体执行相应的代码块。它的语法如下:

match value {
    pattern1 => {
        // 如果 value 匹配了 pattern1
    },
    pattern2 => {
        // 如果 value 匹配了 pattern2
    },
    // 其他模式...
}

如定义一个名为 Color 的枚举类型,其中包含了三个成员:Red、Green 和 Blue。每个成员都是一个合法的标识符,用于表示不同的颜色。

enum Color {
    Red,
    Green,
    Blue,
}

对上述的 Color 枚举类型,可以使用模式匹配来执行相应的操作:

fn print_color(color: Color) {
    match color {
        Color::Red => println!("The color is Red"),
        Color::Green => println!("The color is Green"),
        Color::Blue => println!("The color is Blue"),
    }
}

上述示例中,函数 print_color 接收一个 Color 类型的参数,并使用 match 进行模式匹配。根据传入的颜色值,会执行相应的操作。

枚举方法

还可以自定义方法,为每个成员定义相应的值。

#![allow(dead_code)]

enum Color {
    Red,
    Green,
    Blue,
    Yellow,
    Magenta,
    Cyan,
}

impl Color {
    fn to_rgb(&self) -> (u8, u8, u8) {
        match self {
            Color::Red => (255, 0, 0),
            Color::Green => (0, 255, 0),
            Color::Blue => (0, 0, 255),
            Color::Yellow => (255, 255, 0),
            Color::Magenta => (255, 0, 255),
            Color::Cyan => (0, 255, 255),
        }
    }
}
  
fn main() {
    let red = Color::Red;
    let red_rgb = red.to_rgb();
    println!("RGB value of red: {:?}", red_rgb);
    
    let yellow = Color::Yellow;
    let yellow_rgb = yellow.to_rgb();
    println!("RGB value of yellow: {:?}", yellow_rgb);
}

在上述示例中,我们为 Color 枚举类型实现了一个 to_rgb 方法,用于将颜色转换为 RGB 值。

总结起来,Rust 的枚举类型提供了强大的模式匹配功能,使得枚举类型非常灵活和可靠,适用于各种场景和数据处理需求。本文只初步学习类C风格的枚举类型,其它分类且听下回分解。文章来源地址https://www.toymoban.com/news/detail-601490.html

到了这里,关于Rust 数据类型 之 类C枚举 c-like enum的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • enum枚举类型使用

    static Direction[] values():返回本类所有枚举常量; static Direction valueOf(String name):通过枚举常量的名字返回Direction常量,注意,这个方法与Enum类中的valueOf()方法的参数个数不同

    2024年02月13日
    浏览(40)
  • C语言枚举类型enum(全面详细直观)

    维基百科的理解: 枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。 定义:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。 我的理解: 枚举类型就是将一些比较固定的值一一列举出来 ,比如一年有十二个

    2024年02月06日
    浏览(77)
  • 【golang】每日chatGPT:golang中实现ENUM枚举类型 | go enum

    在golang极简的哲学思想中,没有内置枚举类型 这里我们通过map+iota去实现一个枚举类型 枚举值如下: key value 1 发电类 2 储能类 13 负荷类 打印如下: 发电类 储能类 负荷类 ========= 储能类

    2024年02月15日
    浏览(42)
  • 自定义类型之枚举类型(enum)和联合体类型(union)

    目录   枚举类型(enum) 什么是枚举类型? 枚举类型的使用 枚举类型的优势 枚举类型的应用场景 总结 联合体类型(union) 什么是联合体? 联合体的应用场景 联合体的注意事项 总结 枚举类型是C语言中一种非常有用的数据类型,它允许程序员定义一组命名的常量。枚举类型

    2024年02月20日
    浏览(42)
  • 虚幻C++中的细节之枚举类型(enum)

    虚幻引擎中的代码部分实现了一套反射机制,为c++代码带了更多方便的特性。本篇文章将会着眼于其中更加细节的部分——虚幻中的enum。 在虚幻风格的代码中,我们经常能使用这样的方法来创建枚举类型: 似乎有一些c++的影子,但又好像有一些不一样的部分。它有基本c++的

    2024年02月02日
    浏览(36)
  • 【Rust 基础篇】Rust数据类型详解

    Rust是一种现代的、安全的系统编程语言,注重内存安全和并发性。在Rust中,数据类型是程序中最基本的构建块之一。本篇博客将详细解释Rust的各种数据类型,并提供相关代码示例。 Rust的基本数据类型包括布尔类型、整数类型、浮点类型和字符类型。 1、布尔类型(bool) 布

    2024年02月11日
    浏览(52)
  • 3.Rust数据类型

    Rust 每个值都有其确切的数据类型,总的来说可以分为两类:基本类型和复合类型。 Rust是一个强类型语言与js不同,我们在声明变量时就要指定该变量的类型,编译器必须在编译期知道我们所有变量的类型。当然大多时聪明的编译器可以自动推导类型,但为了保证代码质量和

    2024年03月10日
    浏览(54)
  • 【Rust】Rust学习 第六章枚举和模式匹配

    本章介绍  枚举 ( enumerations ),也被称作  enums 。枚举允许你通过列举可能的  成员 ( variants ) 来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做   Option ,它代表一个值要么是

    2024年02月13日
    浏览(44)
  • Rust语言精讲:数据类型全解析

    大家好!我是lincyang。 今天,我们将深入探讨Rust语言中的数据类型,这是理解和掌握Rust的基础。 Rust语言数据类型概览 Rust是静态类型语言,所有变量类型在编译时确定。Rust的数据类型分为两类:标量类型和复合类型。 标量类型 标量类型是单一值的类型,包括整型、浮点型

    2024年02月05日
    浏览(47)
  • Rust 数据类型 之 结构体(Struct)

    目录 结构体(Struct) 定义与声明 结构体定义 结构体实例 结构体分类 单元结构体(Unit Struct) 元组结构体(Tuple Struct) 具名结构体(Named Struct) 结构体嵌套 结构体方法 例1:结构体转换为字符串描述 例2:矩形的周长和面积 例3:结构体字段的更新与输出 关联函数 结构体

    2024年02月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包