Updated src/Ch08_Common_Collections.md'.

This commit is contained in:
Hector PENG
2026-03-16 11:23:23 +08:00
parent 8d7c95bf8b
commit 28ca3302b5
3 changed files with 16 additions and 18 deletions

View File

@@ -1,15 +1,13 @@
# 一些常用的集合
# 常见集合
**Common Collections**
Rust 的标准库包含数种名为 *集合collection* 的有用数据结构。大多数其他数据类型都表示某个特定值,而集合可以包含多个值。不同于内建的数组和元组类型,这些集合指向的数据存储在堆上,这意味着数据量在编译时无需知道,并且可以随着程序运行而增长或收缩。每种集合都有不同的能力与开销,针对咱们的当前情况选择恰当集合,属于一项咱们将随着时间推移而发展的技能。在这一章中,我们将讨论 Rust 程序中经常用到的三种集合:
Rust 标准库中包含了几种名为 *集合collections* 的有用数据结构。大多数其他数据类型,都表示某个特定值,而集合则可包含多个值。与内建的数组和元组类型不同,这些集合所指向的数据,是存储在堆上的,这就意味着在编译时不需要知道数据的数量,进而在程序运行时,这些数据数量可增加或减少。每种集合都有不同能力与开销,针对应用程序当下情况,而选择恰当的一种集合,则是随着时间推移,要发展的一项编程技能。本章中,将讨论在 Rust 程序中,经常被用到的三种集合:
- *矢量/向量vector*,允许咱们存储彼此相邻的可变数量的值;
- *字符串string*,属于字符的集合。我们早先已经提到过 `String` 类型,而在这一章中,我们将要深入讨论他;
- *哈希映射hash map*,允许我们将值与特定键相关联。他是称为 *映射map* 的更通用数据结构的一种特定实现。
- *矢量* 允许存储并列的数个值;
- *字符串* 是一些字符的集合。早先曾提到过 `String` 类型,而本章就要深入讨论到他;
- *哈希映射hash map* 允许将某个值与特定键进行关联。他是一种更为通用数据结构、名为 *映射map* 的一个特定实现。
要了解由标准库提供的其他集合类别,请参阅 [文档](https://doc.rust-lang.org/std/collections/index.html)。
要了解由标准库所提供的其他类别集合,请参阅 [文档](https://doc.rust-lang.org/std/collections/index.html)
这里将讨论怎样创建与更新矢量、字符串与哈希映射,同时会讨论他们因何而变得特殊。
我们将讨论怎样创建及更新矢量、字符串与哈希映射,以及他们各自的特殊之处

View File

@@ -93,7 +93,7 @@ Rust 选择让模组系统以这种方式运作,从而隐藏内部实现细节
## 以 `pub` 关键字暴露路径
我们来回到清单 7-4 中的报错,他告诉我们 `hosting` 模组是私有的。我们希望父模组中的 `eat_at_restaurant` 函数有着对子模组中 `add_too_waitlist` 函数的访问权限,因此我们以 `pub` 关键字标记 `hosting` 模组,如下清单 7-5 中所示。
我们来回到清单 7-4 中的报错,他告诉我们 `hosting` 模组是私有的。我们希望父模组中的 `eat_at_restaurant` 函数有着对子模组中 `add_to_waitlist` 函数的访问权限,因此我们以 `pub` 关键字标记 `hosting` 模组,如下清单 7-5 中所示。
<a name="listing_7-5"></a>
@@ -163,7 +163,7 @@ error: could not compile `restuarant` (lib) due to 2 previous errors
清单 7-6 中的报错表明 `add_to_waitlist` 函数是私有的。隐私规则适用于结构体、枚举、函数和方法以及模组等。
我们还可通过在 `add_too_waitlist` 函数的定义前添加 `pub` 关键字,构造该函数为公开,如下清单 7-7 中所示。
我们还可通过在 `add_to_waitlist` 函数的定义前添加 `pub` 关键字,构造该函数为公开,如下清单 7-7 中所示。
<a name="listing_7-7"></a>
文件名:`src/lib.rs`
@@ -184,9 +184,9 @@ pub fn eat_at_restaurant() {
}
```
**清单 7-7**:添加 `pub` 关键字到 `mod hosting``fn add_too_waitlist`,让我们可以在 `eat_at_restaurant` 中调用这个函数
**清单 7-7**:添加 `pub` 关键字到 `mod hosting``fn add_to_waitlist`,让我们可以在 `eat_at_restaurant` 中调用这个函数
现在这段代码将编译!为了了解为何添加 `pub` 关键字,就让我们可以在 `add_too_waitlist` 中,在遵守隐私规则下使用这些路径,我们来看一下绝对路径和相对路径。
现在这段代码将编译!为了了解为何添加 `pub` 关键字,就让我们可以在 `add_to_waitlist` 中,在遵守隐私规则下使用这些路径,我们来看一下绝对路径和相对路径。
在绝对路径中,我们以 `crate` 开头,他是咱们代码箱的模组树的根。`front_of_house` 模组定义在代码箱根处。虽然 `front_of_house` 不是公开的,但由于 `eat_at_restaurant` 函数定义在与 `front_of_house` 模组的同一个模组中(即 `eat_at_restaurant``front_of_house` 属于同辈),我们可在 `eat_at_restaurant` 中引用 `front_of_house`。接下来是以 `pub` 标注的 `hosting` 模组。我们可以访问 `hosting` 的父模组,因此我们可以访问 `hosting`。最后,`add_to_waitlist` 函数以 `pub` 标注了,并且我们可以访问他的父模组,因此这个函数调用有效!

View File

@@ -2,7 +2,7 @@
必须写出调用函数的路径可能会感到不便且重复。在 [清单 7-7](paths.md#listing_7-7) 中,无论我们选择 `add_to_waitlist` 函数的绝对路径还是相对路径,每次我们想要调用 `add_to_waitlist` 时,我们都必须还要指定 `front_of_house``hosting`。幸运的是,有一种简化这一过程的方式:我们可以 `use` 关键字创建路径的快捷方式一次,然后在作用域中的其他地方使用较短的名字。
在下面清单 7-11 中,我们将 `crate::front_of_house::hosting` 模组带入 `eat_at_restaurant` 函数的作用域,这样我们只需指定 `hosting::add_too_waitlist` 即可在 `eat_at_restaurant` 中调用 `add_too_waitlist` 函数。
在下面清单 7-11 中,我们将 `crate::front_of_house::hosting` 模组带入 `eat_at_restaurant` 函数的作用域,这样我们只需指定 `hosting::add_to_waitlist` 即可在 `eat_at_restaurant` 中调用 `add_to_waitlist` 函数。
<a name="listing_7-11"></a>
文件名:`src/lib.rs`
@@ -84,7 +84,7 @@ error: could not compile `restaurant` (lib) due to 1 previous error; 1 warning e
## 创建惯用的 `use` 路径
在 [清单 7-11](#listing_7-11) 中,咱们可能想知道为什么我们指定了 `use crate::front_of_house::hosting`,然后在 `eat_at_restaurant` 中调用 `hosting::add_to_waitlist`,而不是指定 `add_too_waitlist` 函数的完整 `use` 路径,如下面清单 7-13 中那样。
在 [清单 7-11](#listing_7-11) 中,咱们可能想知道为什么我们指定了 `use crate::front_of_house::hosting`,然后在 `eat_at_restaurant` 中调用 `hosting::add_to_waitlist`,而不是指定 `add_to_waitlist` 函数的完整 `use` 路径,如下面清单 7-13 中那样。
<a name="listing_7-13"></a>
@@ -106,7 +106,7 @@ pub fn eat_at_restaurant() {
**清单 7-13**:以 `use` 带入 `add_to_waitlist` 到作用域,这属于非惯用的
尽管清单 7-11 和清单 7-13 都完成了同一任务,但清单 7-11 是以 `use` 带入函数到作用域的惯用方式。以 `use` 带入函数的父模到作用域意味着我们在调用函数时必须指定父模组。在调用函数时指定父模组可以清楚地表明该函数不属于本地定义的,同时仍然最大限度地减少完整路径的重复。清单 7-13 中的代码在 `add_too_waitlist` 于何处定义方面不清楚。
尽管清单 7-11 和清单 7-13 都完成了同一任务,但清单 7-11 是以 `use` 带入函数到作用域的惯用方式。以 `use` 带入函数的父模到作用域意味着我们在调用函数时必须指定父模组。在调用函数时指定父模组可以清楚地表明该函数不属于本地定义的,同时仍然最大限度地减少完整路径的重复。清单 7-13 中的代码在 `add_to_waitlist` 于何处定义方面不清楚。
另一方面,在以 `use` 关键字引入结构体、枚举及其他项目时,指定完整路径是惯用的。下面清单 7-14 展示了带入标准库的 `HashMap` 结构体到二进制代码箱的作用域的惯用方式。
@@ -126,7 +126,7 @@ fn main() {
这个习惯用法背后没有什么强有力的理由:他只是已经出现的约定,人们已经习惯了以这种方式阅读和编写 Rust 代码。
这种习惯用法的例外是当我们以 `use` 语句带入两个同名的项目到作用域时,因为 Rust 不允许这样做。下面清单 7-15 展示了如何带入两种有着同一名字但不同父模组的 `Result` 类型到作用域,以及如何引用他们。
这种习惯用法的例外是当我们以 `use` 语句带入两个同名的项目到作用域时,因为 Rust 不允许这样做。下面清单 7-15 展示了如何带入两种有着同一名字但不同父模组的 `Result` 类型到作用域,以及如何引用他们。
<a name="listing_7-15"></a>
文件名:`src/lib.rs`
@@ -199,7 +199,7 @@ pub fn eat_at_restaurant() {
**清单 7-17**:以 `pub use` 在新的作用域中构造项目为可供任何代码使用
在这一修改前,外部代码将必须通过使用路径 `restaurant::front_of_house::hosting::add_too_waitlist()` 路径调用 `add_to_waitlist` 函数,这还需要 `front_of_house` 模组标记为 `pub`。现在,这个 `pub use` 已重导出了根模组中的 `hosting` 模组,外部代码便可使用路径 `restaurant::hosting::add_to_waitlist()`
在这一修改前,外部代码将必须通过使用路径 `restaurant::front_of_house::hosting::add_to_waitlist()` 路径调用 `add_to_waitlist` 函数,这还需要 `front_of_house` 模组标记为 `pub`。现在,这个 `pub use` 已重导出了根模组中的 `hosting` 模组,外部代码便可使用路径 `restaurant::hosting::add_to_waitlist()`
当咱们代码的内部结构不同于与调用咱们代码的程序员,对这一领域的理解方式时,重导出非常有用。例如,在这个餐厅比喻中,经营餐厅的人考虑的是 “前厅” 和 “后厨”。但光顾餐厅的顾客可能不会从这些方面考虑餐厅的各个部分。在 `pub use` 下,我们可以一种结构编写咱们的代码,而暴露另一种结构。这样做使我们的库对在这个库上工作及调用库的程序员,都能保持组织良好。我们将在第 14 章中的 [“导出便利的公开 API”](../crates-io/publishing.md##导出便利的公开-api) 小节中,探讨 `pub use` 的另一个示例,以及他如何影响咱们的代码箱文档。