|
|
|
@ -82,9 +82,9 @@
|
|
|
|
|
|
|
|
|
|
### 使用 `pub use` 重导出名称
|
|
|
|
|
|
|
|
|
|
当使用 `use` 关键字将名称导入作用域时,在新作用域中可用的名称是私有的。如果为了让调用你编写的代码的代码能够像在自己的作用域内引用这些类型,可以结合 `pub` 和 `use`。这个技术被称为 “*重导出*(*re-exporting*)”,因为这样做将项引入作用域并同时使其可供其他代码引入自己的作用域。
|
|
|
|
|
使用 `use` 关键字,将某个名称导入当前作用域后,这个名称在此作用域中就可以使用了,但它对此作用域之外还是私有的。如果想让其他人调用我们的代码时,也能够正常使用这个名称,就好像它本来就在当前作用域一样,那我们可以将 `pub` 和 `use` 合起来使用。这种技术被称为 “*重导出*(*re-exporting*)”:我们不仅将一个名称导入了当前作用域,还允许别人把它导入他们自己的作用域。
|
|
|
|
|
|
|
|
|
|
示例 7-17 展示了将示例 7-11 中使用 `use` 的根模块变为 `pub use` 的版本的代码。
|
|
|
|
|
示例 7-17 将示例 7-11 根模块中的 `use` 改为 `pub use` 。
|
|
|
|
|
|
|
|
|
|
<span class="filename">文件名: src/lib.rs</span>
|
|
|
|
|
|
|
|
|
@ -92,11 +92,11 @@
|
|
|
|
|
{{#rustdoc_include ../listings/ch07-managing-growing-projects/listing-07-17/src/lib.rs}}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
<span class="caption">示例 7-17: 通过 `pub use` 使名称可引入任何代码的作用域中</span>
|
|
|
|
|
<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`,外部代码现在可以通过新路径 `hosting::add_to_waitlist` 来调用 `add_to_waitlist` 函数。如果没有指定 `pub use`,`eat_at_restaurant` 函数可以在其作用域中调用 `hosting::add_to_waitlist`,但外部代码则不允许使用这个新路径。
|
|
|
|
|
|
|
|
|
|
当你的代码的内部结构与调用你的代码的程序员的思考领域不同时,重导出会很有用。例如,在这个餐馆的比喻中,经营餐馆的人会想到“前台”和“后台”。但顾客在光顾一家餐馆时,可能不会以这些术语来考虑餐馆的各个部分。使用 `pub use`,我们可以使用一种结构编写代码,却将不同的结构形式暴露出来。这样做使我们的库井井有条,方便开发这个库的程序员和调用这个库的程序员之间组织起来。
|
|
|
|
|
当你代码的内部结构与调用你代码的程序员所想象的结构不同时,重导出会很有用。例如,在这个餐馆的比喻中,经营餐馆的人会想到“前台”和“后台”。但顾客在光顾一家餐馆时,可能不会以这些术语来考虑餐馆的各个部分。使用 `pub use`,我们可以使用一种结构编写代码,却将不同的结构形式暴露出来。这样做使我们的库井井有条,也使开发这个库的程序员和调用这个库的程序员都更加方便。
|
|
|
|
|
|
|
|
|
|
### 使用外部包
|
|
|
|
|
|
|
|
|
|