在本节,我们将讨论模块和其它一些关于模块系统的部分,如允许你命名项的 路径(paths);用来将路径引入作用域的 关键字;以及使项变为公有的 pub
关键字。我们还将讨论 as
关键字、外部包和 glob 运算符。现在,让我们把注意力放在模块上!
模块 让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性。模块还可以控制项的 私有性,即项是可以被外部代码使用的(public),还是作为一个内部实现的内容,不能被外部代码使用(private)。
在餐饮业,餐馆中会有一些地方被称之为 前台(front of house),还有另外一些地方被称之为 后台(back of house)。前台是招待顾客的地方,在这里,店主可以为顾客安排座位,服务员接受顾客下单和付款,调酒师会制作饮品。后台则是由厨师工作的厨房,洗碗工的工作地点,以及经理做行政工作的地方组成。
Filename: src/lib.rs
示例 7-1:一个包含了其他内置了函数的模块的 front_of_house
模块
我们定义一个模块,是以 mod
关键字为起始,然后指定模块的名字(本例中叫做 front_of_house
),并且用花括号包围模块的主体。在模块内,我们还可以定义其他的模块,就像本例中的 hosting
和 模块。模块还可以保存一些定义的其他项,比如结构体、枚举、常量、特性、或者函数。
在前面我们提到了,src/main.rs
和 src/lib.rs
叫做 crate 根。之所以这样叫它们是因为这两个文件的内容都分别在 crate 模块结构的根组成了一个名为 crate
的模块,该结构被称为 模块树(module tree)。
示例 7-2 展示了示例 7-1 中的模块树的结构。
crate
└── front_of_house
│ ├── add_to_waitlist
│ └── seat_at_table
├── take_order
├── serve_order
示例 7-2: 示例 7-1 中代码的模块树
这个模块树可能会令你想起电脑上文件系统的目录树;这是一个非常恰当的比喻!就像文件系统的目录,你可以使用模块来组织你的代码。并且,就像目录中的文件,我们需要一种方法来找到模块。