@ -189,7 +189,7 @@ loop {
因为 Rust 需要知道例如应该为特定类型的值分配多少空间这样的信息其类型系统的一个特定的角落可能令人迷惑:这就是 ** 动态大小类型**( *dynamically sized types*)的概念。这有时被称为 “DST” 或 “unsized types”, 这些类型允许我们处理只有在运行时才知道大小的类型。
让我们深入研究一个贯穿本书都在使用的动态大小类型的细节:`str`。没错,不是 `&str` ,而是 `str` 本身。`str` 是一个 DST; 直到运行时我们都不知道字符串有多长。因为直到运行时都不能知道大 其小,也就意味着不能创建 `str` 类型的变量,也不能获取 `str` 类型的参数。考虑一下这些代码,他们不能工作:
让我们深入研究一个贯穿本书都在使用的动态大小类型的细节:`str`。没错,不是 `&str` ,而是 `str` 本身。`str` 是一个 DST; 直到运行时我们都不知道字符串有多长。因为直到运行时都不能知道其大 小,也就意味着不能创建 `str` 类型的变量,也不能获取 `str` 类型的参数。考虑一下这些代码,他们不能工作:
```rust,ignore,does_not_compile
let s1: str = "Hello there!";
@ -198,7 +198,7 @@ let s2: str = "How's it going?";
Rust 需要知道应该为特定类型的值分配多少内存,同时所有同一类型的值必须使用相同数量的内存。如果允许编写这样的代码,也就意味着这两个 `str` 需要占用完全相同大小的空间,不过它们有着不同的长度。这也就是为什么不可能创建一个存放动态大小类型的变量的原因。
那么该怎么办呢?你已经知道了这种问题的答案:`s1` 和 `s2` 的类型是 `&str` 而不是 `str` 。如果你回想第四章 [“字符串 slice”][string-slices] 部分, slice 数据结储存了开始位置和 slice 的长度。
那么该怎么办呢?你已经知道了这种问题的答案:`s1` 和 `s2` 的类型是 `&str` 而不是 `str` 。如果你回想第四章 [“字符串 slice”][string-slices] 部分, slice 数据结构 储存了开始位置和 slice 的长度。
所以虽然 `&T` 是一个储存了 `T` 所在的内存位置的单个值,`& str` 则是 ** 两个** 值:`str` 的地址和其长度。这样,`& str` 就有了一个在编译时可以知道的大小:它是 `usize` 长度的两倍。也就是说,我们总是知道 `&str` 的大小,而无论其引用的字符串是多长。这里是 Rust 中动态大小类型的常规用法:他们有一些额外的元信息来储存动态信息的大小。这引出了动态大小类型的黄金规则:必须将动态大小类型的值置于某种指针之后。