Update ch06-01-defining-an-enum.md (#116)

Co-authored-by: YangQi <2419731931@qq.com>
This commit is contained in:
focksor surooi 2022-12-18 09:21:04 +08:00 committed by GitHub
parent 775486ecdc
commit c69df02e4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,6 +1,6 @@
## 定义枚举
让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准IPv4version four和 IPv6version six。这是我们的程序可能会遇到的所有可能的 IP 地址类型所以可以 **枚举** 出所有可能的值,这也正是此枚举名字的由来。
让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准IPv4version four和 IPv6version six。这是我们的程序可能会遇到的所有可能的 IP 地址类型所以可以 **枚举** 出所有可能的值,这也正是此枚举名字的由来。
任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的而且不能两者都是。IP 地址的这个特性使得枚举数据结构非常适合这个场景因为枚举值只可能是其中一个成员。IPv4 和 IPv6 从根本上讲仍是 IP 地址,所以当代码在处理适用于任何类型的 IP 地址的场景时应该把它们当作相同的类型。
@ -80,7 +80,7 @@ let loopback = IpAddr {
<span class="caption">示例 6-1将 IP 地址的数据和 `IpAddrKind` 成员存储在一个 `struct`</span>
这里我们定义了一个有两个字段的结构体 `IpAddr``IpAddrKind`(之前定义的枚举)类型的 `kind` 字段和 `String` 类型 `address` 字段。我们有这个结构体的两个实例。第一个,`home`,它的 `kind` 的值是 `IpAddrKind::V4` 与之相关联的地址数据是 `127.0.0.1`。第二个实例,`loopback``kind` 的值是 `IpAddrKind` 的另一个成员,`V6`,关联的地址是 `::1`。我们使用了一个结构体来将 `kind``address` 打包在一起,现在枚举成员就与值相关联了。
这里我们定义了一个有两个字段的结构体 `IpAddr``IpAddrKind`(之前定义的枚举)类型的 `kind` 字段和 `String` 类型 `address` 字段。我们有这个结构体的两个实例。第一个,`home`,它的 `kind` 的值是 `IpAddrKind::V4` 与之相关联的地址数据是 `127.0.0.1`。第二个实例,`loopback``kind` 的值是 `IpAddrKind` 的另一个成员,`V6`,关联的地址是 `::1`。我们使用了一个结构体来将 `kind``address` 打包在一起,现在枚举成员就与值相关联了。
我们可以使用一种更简洁的方式来表达相同的概念,仅仅使用枚举并将数据直接放进每一个枚举成员而不是将枚举作为结构体的一部分。`IpAddr` 枚举的新定义表明了 `V4``V6` 成员都关联了 `String` 值:
@ -193,7 +193,7 @@ m.call();
### `Option` 枚举和其相对于空值的优势
在之前的部分,我们看到了 `IpAddr` 枚举如何利用 Rust 的类型系统在程序中编码更多信息而不单单是数据。接下来我们分析一个 `Option` 的案例,`Option` 是标准库定义的另一个枚举。`Option` 类型应用广泛因为它编码了一个非常普遍的场景,即一个值要么有值要么没值。从类型系统的角度来表达这个概念就意味着编译器需要检查是否处理了所有应该处理的情况,这样就可以避免在其他编程语言中非常常见的 bug。
在之前的部分,我们看到了 `IpAddr` 枚举如何利用 Rust 的类型系统在程序中编码更多信息而不单单是数据。接下来我们分析一个 `Option` 的案例,`Option` 是标准库定义的另一个枚举。`Option` 类型应用广泛因为它编码了一个非常普遍的场景,即一个值要么有值要么没值。从类型系统的角度来表达这个概念就意味着编译器需要检查是否处理了所有应该处理的情况,这样就可以避免在其他编程语言中非常常见的 bug。
编程语言的设计经常要考虑包含哪些功能但考虑排除哪些功能也很重要。Rust 并没有很多其他语言中有的空值功能。**空值***Null* )是一个值,它代表没有值。在有空值的语言中,变量总是这两种状态之一:空值和非空值。