@ -150,7 +150,126 @@ let home = IpAddr::V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));
</code></pre>
<p>我们直接将数据附加到枚举的每个成员上,这样就不需要一个额外的结构体了。</p>
<p>使用枚举而不是结构体还有另外一个优势:每个成员可以处理不同类型和数量的数据。</p>
<p>使用枚举而不是结构体还有另外一个优势:每个成员可以处理不同类型和数量的数据。IPv4 版本的 IP 地址总是含有四个值在 0 和 255 之间的数字部分。如果我们想要将<code>V4</code>地址储存为四个<code>u8</code>值而<code>V6</code>地址仍然表现为一个<code>String</code>,这就不能使用结构体了。枚举可以轻易处理的这个情况:</p>
<pre><codeclass="language-rust">enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}
let home = IpAddr::V4(127, 0, 0, 1);
let loopback = IpAddr::V6(String::from("::1"));
</code></pre>
<p>这些代码展示了使用枚举来储存两种不同 IP 地址的几种可能的选择。然而,事实证明储存和编码 IP 地址实在是太常见了<ahref="../std/net/enum.IpAddr.html">以致标准库提供了一个可供使用的定义!</a><!-- ignore -->让我们看看标准库如何定义<code>IpAddr</code>的:它正有着跟我们定义和使用的一样的枚举和成员,不过它将成员种的地址数据嵌入到了两个不同形式的结构体中,他们对不同的成员的定义是不同的:</p>
@ -2741,8 +2741,133 @@ let home = IpAddr::V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));
</code></pre>
<p>我们直接将数据附加到枚举的每个成员上,这样就不需要一个额外的结构体了。</p>
<p>使用枚举而不是结构体还有另外一个优势:每个成员可以处理不同类型和数量的数据。</p>
<h1>The <code>match</code> Control Flow Operator</h1>
<p>使用枚举而不是结构体还有另外一个优势:每个成员可以处理不同类型和数量的数据。IPv4 版本的 IP 地址总是含有四个值在 0 和 255 之间的数字部分。如果我们想要将<code>V4</code>地址储存为四个<code>u8</code>值而<code>V6</code>地址仍然表现为一个<code>String</code>,这就不能使用结构体了。枚举可以轻易处理的这个情况:</p>
<pre><codeclass="language-rust">enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}
let home = IpAddr::V4(127, 0, 0, 1);
let loopback = IpAddr::V6(String::from("::1"));
</code></pre>
<p>这些代码展示了使用枚举来储存两种不同 IP 地址的几种可能的选择。然而,事实证明储存和编码 IP 地址实在是太常见了<ahref="../std/net/enum.IpAddr.html">以致标准库提供了一个可供使用的定义!</a><!-- ignore -->让我们看看标准库如何定义<code>IpAddr</code>的:它正有着跟我们定义和使用的一样的枚举和成员,不过它将成员种的地址数据嵌入到了两个不同形式的结构体中,他们对不同的成员的定义是不同的:</p>
@ -109,4 +109,179 @@ let loopback = IpAddr::V6(String::from("::1"));
我们直接将数据附加到枚举的每个成员上,这样就不需要一个额外的结构体了。
使用枚举而不是结构体还有另外一个优势:每个成员可以处理不同类型和数量的数据。
使用枚举而不是结构体还有另外一个优势:每个成员可以处理不同类型和数量的数据。IPv4 版本的 IP 地址总是含有四个值在 0 和 255 之间的数字部分。如果我们想要将`V4`地址储存为四个`u8`值而`V6`地址仍然表现为一个`String`,这就不能使用结构体了。枚举可以轻易处理的这个情况:
```rust
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}
let home = IpAddr::V4(127, 0, 0, 1);
let loopback = IpAddr::V6(String::from("::1"));
```
这些代码展示了使用枚举来储存两种不同 IP 地址的几种可能的选择。然而,事实证明储存和编码 IP 地址实在是太常见了[以致标准库提供了一个可供使用的定义!][IpAddr]<!-- ignore -->让我们看看标准库如何定义`IpAddr`的:它正有着跟我们定义和使用的一样的枚举和成员,不过它将成员种的地址数据嵌入到了两个不同形式的结构体中,他们对不同的成员的定义是不同的: