|
|
|
@ -10,7 +10,7 @@ Rust 的类型系统有一些我们曾经提到但没有讨论过的功能。首
|
|
|
|
|
|
|
|
|
|
### 为了类型安全和抽象而使用 newtype 模式
|
|
|
|
|
|
|
|
|
|
newtype 模式可以用于一些其他我们还未讨论的功能,包括静态的确保某值不被混淆,和用来表示一个值的单元。实际上示例 19-23 中已经有一个这样的例子:`Millimeters` 和 `Meters` 结构体都在 newtype 中封装了 `u32` 值。如果编写了一个有 `Millimeters` 类型参数的函数,不小心使用 `Meters` 或普通的 `u32` 值来调用该函数的程序是不能编译的。
|
|
|
|
|
newtype 模式可以用于一些其他我们还未讨论的功能,包括静态的确保某值不被混淆,和用来表示一个值的单元。实际上示例 19-15 中已经有一个这样的例子:`Millimeters` 和 `Meters` 结构体都在 newtype 中封装了 `u32` 值。如果编写了一个有 `Millimeters` 类型参数的函数,不小心使用 `Meters` 或普通的 `u32` 值来调用该函数的程序是不能编译的。
|
|
|
|
|
|
|
|
|
|
另一个 newtype 模式的应用在于抽象掉一些类型的实现细节:例如,封装类型可以暴露出与直接使用其内部私有类型时所不同的公有 API,以便限制其功能。
|
|
|
|
|
|
|
|
|
@ -24,7 +24,7 @@ newtype 也可以隐藏其内部的泛型类型。例如,可以提供一个封
|
|
|
|
|
type Kilometers = i32;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这意味着 `Kilometers` 是 `i32` 的 **同义词**(*synonym*);不同于示例 19-23 中创建的 `Millimeters` 和 `Meters` 类型。`Kilometers` 不是一个新的、单独的类型。`Kilometers` 类型的值将被完全当作 `i32` 类型值来对待:
|
|
|
|
|
这意味着 `Kilometers` 是 `i32` 的 **同义词**(*synonym*);不同于示例 19-15 中创建的 `Millimeters` 和 `Meters` 类型。`Kilometers` 不是一个新的、单独的类型。`Kilometers` 类型的值将被完全当作 `i32` 类型值来对待:
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
type Kilometers = i32;
|
|
|
|
|