Updated 'src/packages_crates_and_modules/paths.md'.

This commit is contained in:
Hector PENG 2024-10-06 19:45:19 +08:00
parent 37ed9084bc
commit d109663cef

View File

@ -208,14 +208,15 @@ pub fn eat_at_restaurant() {
> 在 [第 12 章](../Ch12_An_IO_Project_Building_a_Command_Line_Program.md),我们将以同时包含一个二进制代码箱,与一个库代码箱的命令行程序,演示这种代码组织实践。
## 使用 `super` 关键字开始相对路径
## `super` 关键字开始相对路径
**Starting Relative Paths with `super`**
我们可以通过在路径开头,使用 `super` 关键字构建从父模组,而不是当前模组或代码箱根开始的相对路径。这就像用 `..` 语法,开始文件系统路径一样。当该模组与父模组关系密切,使用 `super` 就能让我们引用父模组中的项目,而父模组有可能在某一天,被移到模组树的其他地方时,使重新排列模组树变得更容易。
通过在路径开头使用 `super` 关键字,就可以构建出在父模组处,而非当前模组或代码箱根处开始的相对路径。这与以 `..` 语法开始的文件系统路径相似。使用 `super` 实现了对已知在父模组中某个程序项目的引用,在模组与其父模组密切相关,但该父模组在某个时候可能会被迁移到模组树中别的地方时,这种使用 `super` 关键字的相对路径,就能让模组树的重新安排更为容易。
设想下面清单 7-8 中,建模了一位大厨修正某个不正确点餐,并亲自将其交给顾客的代码。其中定义在 `back_of_house` 模组中的函数 `fix_incorrect_order`,通过以 `super` 作为开头指明的 `deliver_order` 路径,调用了定义在父模组中的该 `deliver_order` 函数:
请看以下清单 7-8 中的代码,该代码建模了厨师修改错误订单,并亲自将其送到顾客手中的情况。`back_of_house` 模组中定义的 `fix_incorrect_order` 函数,通过指定从 `super` 开始的 `deliver_order` 路径,调用了父模组中定义的 `deliver_order` 函数。
文件名:`src/lib.rs`
@ -234,16 +235,15 @@ mod back_of_house {
*清单 7-8使用以 `super` 开头的相对路径调用某个函数*
这个 `fix_incorrect_order` 函数是在 `back_of_house` 模组中,因此就可以使用 `super` 关键字,前往到 `back_of_house` 的父模组,那就是此示例中的 `crate`,亦即代码箱根。在那里,就会查找 `deliver_order` 进而找到他。大功告成!这里把 `back_of_house` 模组与 `deliver_order` 函数,设想作可能维持这同样关系,并在今后决定要对这个代码箱的模组树,进行重新组织时,他们会一起被移动。因此,这里使用了 `super`,从而今后在此代码被移入到别的模组时,要更新代码的地方就会少一些。
`fix_incorrect_order` 函数位于 `back_of_house` 模组中,因此我们可以使用 `super` 进入 `back_of_house` 的父模组,在本例中就是根模组 `crate`。在那里,我们查找 `deliver_order`,并找到了他。成功!我们认为,如果我们决定重新组织该代码箱的模组树,`back_of_house` 模组和 `deliver_order` 函数基本会保持相同的关系,而会在重新组织时被一起移动。因此,我们使用了 `super`,这样将来如果这些代码被移动到不同模组,我们就可以减少更新代码的地方。
## 将结构体与枚举构造为公共项目
## 将结构体与枚举构造为公
**Making Structs and Enums Public**
这里还可以使用 `pub` 关键字,来将结构体与枚举,指定为公开项目,但结构体与枚举下 `pub` 的用法,有着几个额外情况。在结构体定义前使用 `pub` 关键字时,就将该结构体构造为了公开,但该结构体的那些字段,仍将是私有。可根据具体情况,把各个字段构造为公开或不公开。在下面清单 7-9 中,就定义了有着公开 `toast` 字段,和私有 `seasonal_fruit` 字段的一个公开的 `back_of_house::Breakfast` 结构体。这就对在某个饭馆中,顾客可在何处挑选与正餐搭配的面包类型,而主厨则会根据当季及仓库里有些什么,而决定由哪些水果来搭配正餐,这种情形进行了建模。可用的水果变化很快,因此顾客就无法对水果进行选择,甚至他们看不到会得到什么样的水果。
我们也可以使用 `pub` 关键字,将结构体和枚举指定为公开,但结构体和枚举的 `pub` 用法时,有一些额外细节。如果我们在结构体定义之前使用 `pub`,那么该结构体就会被公开,但结构体的字段仍然是私有的。我们可以根据具体情况,决定是否公开每个字段。在下面清单 7-9 中,我们定义了一个公开的 `back_of_house::Breakfast` 结构体,其中有个公开的 `toast` 字段,但却有个私有的 `seasonal_fruit` 字段。这就建模了某家餐厅的情况:顾客可以选择配餐的面包类型,但厨师会根据当季和库存情况,决定配餐的水果。可用的水果变化很快,因此顾客无法选择水果,甚至无法看到他们会吃到哪种水果。
文件名:`src/lib.rs`