Merge pull request #16 from boholder/patch-1

Filled in the missing part of ch07-02-defining-modules-to-control-sco…
This commit is contained in:
Aaran Xu 2021-10-26 01:26:20 +08:00 committed by GitHub
commit d59566811f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -27,3 +27,30 @@ mod front_of_house {
}
}
```
<span class="caption">示例 7-1一个包含着含有函数的其他模块们的 `front_of_house` 模块</span>
我们用关键字 `mod` 定义一个模块,指定模块的名字(在示例中为 `front_of_house`),并用大括号包围模块的主体。我们可以在模块中包含其他模块,就像本示例中的 `hosting``serving` 模块。模块中也可以包含其他项比如结构体、枚举、常量、trait或者像示例 7-1 一样——包含函数。
通过使用模块,我们可以把相关的定义组织起来,并通过模块命名来解释为什么它们之间有相关性。使用这部分代码的程序员可以更方便的循着这种分组找到自己需要的定义,而不需要通览所有。编写这部分代码的程序员通过分组知道该把新功能放在哪里以便继续让程序保持组织性。
之前我们提到,*src/main.rs* 和 *src/lib.rs* 被称为 crate 根。如此称呼的原因是,这两个文件中任意一个的内容会构成名为 `crate` 的模块,且该模块位于 crate 的被称为 *模块树* 的模块结构的根部("at the root of the crates module structure")。
示例 7-2 展示了示例 7-1 所对应的模块树。
```text
crate
└── front_of_house
├── hosting
│ ├── add_to_waitlist
│ └── seat_at_table
└── serving
├── take_order
├── serve_order
└── take_payment
```
<span class="caption">示例 7-2示例 7-1 中代码对应的模块树</span>
这个树展示了模块间是如何相互嵌套的(比如,`hosting` 嵌套在 `front_of_house` 内部)。这个树还展示了一些模块互为 *兄弟* ,即它们被定义在同一模块内(`hosting` 和 `serving` 都定义在 `front_of_house`。继续使用家族比喻如果模块A包含在模块B的内部我们称模块A是模块B的 *孩子* 且模块B是模块A的 *父辈* 。注意整个模块树的根位于名为 `crate` 的隐式模块下。
模块树或许让你想起了电脑上文件系统的目录树。这是一个非常恰当的比喻!就像文件系统中的目录那样,你应使用模块来组织你的代码。而且就像一个目录中的文件那样,我们需要一个找到我们的模块的方式。