Rust 枚举

作者: kaiv2 | 来源:发表于2020-04-04 22:19 被阅读0次

枚举

枚举,也被称作enums。枚举允许你通过列举可能的值来定义一个类型。

定义枚举

enum IpAddrKind {
    V4,
    V6,
}

枚举值

let four = IpaddrKind::V4;
let six = IpaddrKind::V6;

可以使用任一成员来调用这个函数:

fn route(ip_type: IpAddrKind) -> {}
route(IpAddrKind:V4);
route(IpAddrKind:V6);

使用枚举值还有更多的优势。目前没有一个储存实际 IP 地址数据的方法;只知道他是什么类型的。考虑已经学过结构体了,你可能会像下面处理这个问题:

enum IpAddrKind {
    V4,
    V6,
}

struct IpAddr {
    kind: IpAddrKind,
    address: String,
}

let home = IpAddr {
    kind: IpAddrKind::V4,
    address: String::from("127.0.0.1"),
}

let loopback = IpAddr {
    kind: IpAddrKind::V6,
    address: String::from("::1"),
}

这里我们定义了一个有两个字段的结构体IpAddr:IpaddrKind类型的 kindString类型的address字段。

我们可以使用更简洁的方式来表达相同的概念,仅仅使用枚举并将数据直接放进每一个枚举成员而不是将枚举作为结构体的一部分。

enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}

let home = IpAddr::V4(127, 0, 0, 1);
let loopback = IpAddr::V6(String::from("::1"));

注意虽然标准库中包含一个IpAddr的定义,仍然可以创建和使用我们自己的定义而不会有冲突,因为我们并没有将标准库中的定义引入作用域。

枚举成员可嵌入多种多样的类型。机构体和枚举还有另一个相识点:可以使用 impl来为枚举定义方法。

enum Message {
    Quit,
    Move{ x: i32, y: i32},
    Write(String),
    ChangeColor(i32, i32, i32),
}

impl Message {
    fn call(&self) {
        
    }
}

let m = Message::Write(String::from("hello"));
m.call();

这个枚举有四个含有不同类型的成员:

  • Quit没有关联任何数据
  • Move包含一个匿名结构体
  • Write包含单独一个String
  • ChangeColor包含三个i32

Option枚举和其相对于空值的优势

空值的问题在于当你尝试像一个非空值那样使用一个空值,会出现某种形式的错误。因为空和非空的属性无处不在,非常容易出现这类错误。

然而,空值表达式的概念任然是有意义的:空值是一个因为某种原因目前无效或缺失的值。

问题不在于概念而在于具体实现。Rust 并没有空值,不过它确实拥有一个可以编码存在或不存在概念的枚举。这个枚举是Option。而且它定义于标准库中,如下:

enum Option<T> {
    None,
    Some(T),
}

你不需要将其显示的引入作用域。另外,它的成员也是如此,可以不需要Option::前缀来直接使用SomeNone。即便如此Option也仍是有效的枚举,Some(T)None仍是Option的成员。

let x: i8 = 5;
let y: Option<i8> = Some(5);

let sum = x + y; // 这里将报错

事实上,这里 Rust不知道如何将 Option<i8>i8相加,因为它们的类型不同。

相关文章

  • Rust语言教程(9) - if let表达式与枚举进阶

    Rust语言教程(9) - if let表达式与枚举进阶 枚举复习 前面我们介绍了Rust中的枚举类型,以及通过枚...

  • Rust 枚举

    枚举 枚举,也被称作enums。枚举允许你通过列举可能的值来定义一个类型。 定义枚举 枚举值 可以使用任一成员来调...

  • 新贵 Rust(3) — 枚举

    今天分享的是枚举 enum, 下面我们定义了一个简单 Direction 枚举。定义枚举的方法和struct 类似...

  • 2020 Rust 入门 枚举

    甜点 我们有时候感觉很简单东西,想一看而过,这样还是不够的。我们还是要动手试一试,只有动手才是自己的。 今天主要分...

  • 2020 Rust 入门 枚举

    模式匹配是许多函数式编程语言(如Haskell或Scala) 的基础和强大的构建块。对于最初接触面向对象语言来说,...

  • summary

    Rust 并没有空值,不过它确实拥有一个可以编码 存在或不存在概念的枚举。这个枚举是 Option ,而且它...

  • 枚举模式与match

    1,枚举的定义与基本使用 具体可以参考该文档:https://rust.bootcss.com/ch06-01-d...

  • rust与c,c++,go,java性能比较

    一,rust与c 二,rust与c++ 三,rust与go 四,rust与java

  • Rust —— 实用的工具 —— 检查内存泄漏

    Rust By Example https://doc.rust-lang.org/stable/rust-by-...

  • RUST学习资源

    《通过例子学 Rust》 《Rust by Example》 《Rust 程序设计语言(第一版)》 《Rust 程...

网友评论

    本文标题:Rust 枚举

    本文链接:https://www.haomeiwen.com/subject/gtviyhtx.html