|
|
@ -10,7 +10,7 @@ Rust 的类型系统有一些我们曾经提到但没有讨论过的功能。首
|
|
|
|
|
|
|
|
|
|
|
|
### 为了类型安全和抽象而使用 newtype 模式
|
|
|
|
### 为了类型安全和抽象而使用 newtype 模式
|
|
|
|
|
|
|
|
|
|
|
|
newtype 模式可以用于一些其他我们还未讨论的功能,包括静态的确保某值不被混淆,和用来表示一个值的单元。实际上示例 19-15 中已经有一个这样的例子:`Millimeters` 和 `Meters` 结构体都在 newtype 中封装了 `u32` 值。如果编写了一个有 `Millimeters` 类型参数的函数,不小心使用 `Meters` 或普通的 `u32` 值来调用该函数的程序是不能编译的。
|
|
|
|
newtype 模式可以用于一些其他我们还未讨论的功能,包括静态的确保某值不被混淆,和用来表示一个值的单位。实际上示例 19-15 中已经有一个这样的例子:`Millimeters` 和 `Meters` 结构体都在 newtype 中封装了 `u32` 值。如果编写了一个有 `Millimeters` 类型参数的函数,不小心使用 `Meters` 或普通的 `u32` 值来调用该函数的程序是不能编译的。
|
|
|
|
|
|
|
|
|
|
|
|
另一个 newtype 模式的应用在于抽象掉一些类型的实现细节:例如,封装类型可以暴露出与直接使用其内部私有类型时所不同的公有 API,以便限制其功能。
|
|
|
|
另一个 newtype 模式的应用在于抽象掉一些类型的实现细节:例如,封装类型可以暴露出与直接使用其内部私有类型时所不同的公有 API,以便限制其功能。
|
|
|
|
|
|
|
|
|
|
|
@ -124,7 +124,7 @@ never type 的另一个用途是 `panic!`。还记得 `Option<T>` 上的 `unwrap
|
|
|
|
|
|
|
|
|
|
|
|
### 动态大小类型和 `Sized` trait
|
|
|
|
### 动态大小类型和 `Sized` trait
|
|
|
|
|
|
|
|
|
|
|
|
因为 Rust 需要知道例如应该为特定类型的值分配多少空间这样的信息其类型系统的一个特定的角落可能令人迷惑:这就是 **动态大小类型**(*dynamically sized types*)的概念。这有时被称为 “DST” 或 “unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。
|
|
|
|
Rust 需要知道有关类型的某些细节,例如为特定类型的值需要分配多少空间。这使得类型系统的一个概念有些令人迷惑:即 **动态大小类型**(*dynamically sized types*)。这有时被称为 “DST” 或 “unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。
|
|
|
|
|
|
|
|
|
|
|
|
让我们深入研究一个贯穿本书都在使用的动态大小类型的细节:`str`。没错,不是 `&str`,而是 `str` 本身。`str` 是一个 DST;直到运行时我们都不知道字符串有多长。因为直到运行时都不能知道其大小,也就意味着不能创建 `str` 类型的变量,也不能获取 `str` 类型的参数。考虑一下这些代码,他们不能工作:
|
|
|
|
让我们深入研究一个贯穿本书都在使用的动态大小类型的细节:`str`。没错,不是 `&str`,而是 `str` 本身。`str` 是一个 DST;直到运行时我们都不知道字符串有多长。因为直到运行时都不能知道其大小,也就意味着不能创建 `str` 类型的变量,也不能获取 `str` 类型的参数。考虑一下这些代码,他们不能工作:
|
|
|
|
|
|
|
|
|
|
|
|