mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2024-11-13 03:21:20 +08:00
Merge pull request #657 from ljkgpxs/patch-1
Update ch07-02-defining-modules-to-control-scope-and-privacy.md
This commit is contained in:
commit
9d756a7b66
@ -13,8 +13,8 @@
|
||||
这里我们提供一个简单的参考,用来解释模块、路径、`use`关键词和`pub`关键词如何在编译器中工作,和大部分开发者如何组织他们的代码。我们将在这个章节中对每条规则的例子一一列举,但这是一个用来参考的好地方用于表达模块是如何工作的。
|
||||
|
||||
- **从crate根节点开始**: 当编译一个crate, 编译器首先在crate根文件(通常,对于一个库crate而言是*src/lib.rs*,对于一个二进制crate而言是*src/main.rs*)中寻找需要被编译的代码。
|
||||
- **声明模块**: 在crate根文件中,你可以声明一个新模块;比如,你用过`mod garden`声明了一个叫做`garden`的模块。编译器会在下列路径中寻找模块代码:
|
||||
- 内联, 在大括号中,当`mod garden`后方不是一个分号而是一个大括号
|
||||
- **声明模块**: 在crate根文件中,你可以声明一个新模块;比如,你用`mod garden`声明了一个叫做`garden`的模块。编译器会在下列路径中寻找模块代码:
|
||||
- 内联,在大括号中,当`mod garden`后方不是一个分号而是一个大括号
|
||||
- 在文件 *src/garden.rs*
|
||||
- 在文件 *src/garden/mod.rs*
|
||||
- **声明子模块**: 在除了crate根节点以外的其他文件中,你可以定义子模块。比如,你可能在*src/garden.rs*中定义了`mod vegetables;`。编译器会在以父模块命名的目录中寻找子模块代码:
|
||||
|
@ -94,7 +94,7 @@
|
||||
|
||||
<span class="caption">示例 7-17: 通过 `pub use` 使名称可从新作用域中被导入至任何代码</span>
|
||||
|
||||
通过 `pub use`,外部代码现在可以通过新路径 `hosting::add_to_waitlist` 来调用 `add_to_waitlist` 函数。如果没有指定 `pub use`,`eat_at_restaurant` 函数可以在其作用域中调用 `hosting::add_to_waitlist`,但外部代码则不允许使用这个新路径。
|
||||
通过 `pub use`重导出,外部代码现在可以通过新路径 `restaurant::hosting::add_to_waitlist` 来调用 `add_to_waitlist` 函数。如果没有指定 `pub use`,外部代码需在其作用域中调用 `restaurant::front_of_house::hosting::add_to_waitlist`。
|
||||
|
||||
当你代码的内部结构与调用你代码的程序员所想象的结构不同时,重导出会很有用。例如,在这个餐馆的比喻中,经营餐馆的人会想到“前台”和“后台”。但顾客在光顾一家餐馆时,可能不会以这些术语来考虑餐馆的各个部分。使用 `pub use`,我们可以使用一种结构编写代码,却将不同的结构形式暴露出来。这样做使我们的库井井有条,也使开发这个库的程序员和调用这个库的程序员都更加方便。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user