|
|
|
@ -22,7 +22,7 @@
|
|
|
|
|
|
|
|
|
|
<span class="caption">示例 8-11:新建一个空的 `String`</span>
|
|
|
|
|
|
|
|
|
|
这新建了一个叫做 `s` 的空的字符串,接着我们可以向其中装载数据。通常字符串会有初始数据,因为我们希望一开始就有这个字符串。为此,可以使用 `to_string` 方法,它能用于任何实现了 `Display` trait 的类型,字符串字面值也实现了它。示例 8-12 展示了两个例子。
|
|
|
|
|
这新建了一个叫做 `s` 的空的字符串,接着我们可以向其中装载数据。通常字符串会有初始数据,因为我们希望一开始就有这个字符串。为此,可以使用 `to_string` 方法,它能用于任何实现了 `Display` trait 的类型,比如字符串字面值。示例 8-12 展示了两个例子。
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
{{#rustdoc_include ../listings/ch08-common-collections/listing-08-12/src/main.rs:here}}
|
|
|
|
@ -163,7 +163,7 @@ let hello = "Здравствуйте";
|
|
|
|
|
let answer = &hello[0];
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
我们已经知道 `answer` 不是第一个字符 `З`。当使用 UTF-8 编码时,`З` 的第一个字节 `208`,第二个是 `151`,所以 `answer` 实际上应该是 `208`,不过 `208` 自身并不是一个有效的字母。返回 `208` 可不是一个请求字符串第一个字母的人所希望看到的,不过它是 Rust 在字节索引 0 位置所能提供的唯一数据。用户通常不会想要一个字节值被返回,即便这个字符串只有拉丁字母:即便 `&"hello"[0]` 是返回字节值的有效代码,它也应当返回 `104` 而不是 `h`。
|
|
|
|
|
我们已经知道 `answer` 不是第一个字符 `З`。当使用 UTF-8 编码时,`З` 的第一个字节 `208`,第二个是 `151`,所以 `answer` 实际上应该是 `208`,不过 `208` 自身并不是一个有效的字母。返回 `208` 可不是一个请求字符串第一个字母的人所希望看到的,不过它是 Rust 在字节索引 0 位置所能提供的唯一数据。用户通常不会想要一个字节值被返回。即使这个字符串只有拉丁字母,如果 `&"hello"[0]` 是返回字节值的有效代码,它也会返回 `104` 而不是 `h`。
|
|
|
|
|
|
|
|
|
|
为了避免返回意外的值并造成不能立刻发现的 bug,Rust 根本不会编译这些代码,并在开发过程中及早杜绝了误会的发生。
|
|
|
|
|
|
|
|
|
@ -192,7 +192,7 @@ let answer = &hello[0];
|
|
|
|
|
|
|
|
|
|
Rust 提供了多种不同的方式来解释计算机储存的原始字符串数据,这样程序就可以选择它需要的表现方式,而无所谓是何种人类语言。
|
|
|
|
|
|
|
|
|
|
最后一个 Rust 不允许使用索引获取 `String` 字符的原因是,索引操作预期总是需要常数时间 (O(1))。但是对于 `String` 不可能保证这样的性能,因为 Rust 必须从开头到索引位置遍历来确定有多少有效的字符。
|
|
|
|
|
最后一个 Rust 不允许使用索引获取 `String` 字符的原因是,索引操作预期总是需要常数时间(O(1))。但是对于 `String` 不可能保证这样的性能,因为 Rust 必须从开头到索引位置遍历来确定有多少有效的字符。
|
|
|
|
|
|
|
|
|
|
### 字符串 slice
|
|
|
|
|
|
|
|
|
@ -212,7 +212,7 @@ let s = &hello[0..4];
|
|
|
|
|
{{#include ../listings/ch08-common-collections/output-only-01-not-char-boundary/output.txt}}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
你应该小心谨慎的使用这个操作,因为这么做可能会使你的程序崩溃。
|
|
|
|
|
你应该小心谨慎地使用这个操作,因为这么做可能会使你的程序崩溃。
|
|
|
|
|
|
|
|
|
|
### 遍历字符串的方法
|
|
|
|
|
|
|
|
|
@ -254,7 +254,7 @@ for b in "Зд".bytes() {
|
|
|
|
|
|
|
|
|
|
### 字符串并不简单
|
|
|
|
|
|
|
|
|
|
总而言之,字符串还是很复杂的。不同的语言选择了不同的向程序员展示其复杂性的方式。Rust 选择了以准确的方式处理 `String` 数据作为所有 Rust 程序的默认行为,这意味着程序员们必须更多的思考如何预先处理 UTF-8 数据。这种权衡取舍相比其他语言更多的暴露出了字符串的复杂性,不过也使你在开发生命周期后期免于处理涉及非 ASCII 字符的错误。
|
|
|
|
|
总而言之,字符串还是很复杂的。不同的语言选择了不同的向程序员展示其复杂性的方式。Rust 选择了以准确的方式处理 `String` 数据作为所有 Rust 程序的默认行为,这意味着程序员们必须更多的思考如何预先处理 UTF-8 数据。这种权衡取舍相比其他语言更多的暴露出了字符串的复杂性,不过也使你在开发周期后期免于处理涉及非 ASCII 字符的错误。
|
|
|
|
|
|
|
|
|
|
好消息是标准库提供了很多围绕 `String` 和 `&str` 构建的功能,来帮助我们正确处理这些复杂场景。请务必查看这些使用方法的文档,例如 `contains` 来搜索一个字符串,和 `replace` 将字符串的一部分替换为另一个字符串。
|
|
|
|
|
|
|
|
|
|