一个包可以包含多个二进制crate项和一个可选的crate库。随着包的增长,可以将包中的部分代码提取出来,做成独立的crate,这些crate则作为外部依赖项。通过接口可以实现代码重用。
这里体现的封装思想类似于c++里面的类,以及python里面的模块思想。
Rust的“模块系统 module system” 包括:

  • 包packages: Cargo的一个功能,允许你创建、测试、和分享crate
  • Crates:一个模块的树形结构,形成了库或二进制项目
  • 模块modules和use: 允许你控制作用域和路径的私有性
  • 路径:一个命名例如结构体、函数或模块等项的方式

crate分为二进制crate和库crate。
一个包至少包含一个crate,最多包含一个库crate,可以包含任意个二进制crate。
包是提供一系列功能的一个或多个crate。一个包包含一个Cargo.toml文件,阐述如何去构建这些crate。
当我们用cargo创建一个项目时,其实是创建了一个包package。

  1. cargo new my-pro
  2. //my-pro 目录
  3. Cargo.toml
  4. src
  5. main.rs
  6. Cargo.toml阐述了如何构建包里面的crate
  7. my-pro包里面只包含一个crate main.rs 这是一个和包同名的二进制crate的根
  8. crate根文件由Cargo传递给rustc 构建库或者二进制项目

定义模块来控制作用域与私有性

模块让我们能够将一个crate中的代码分组,提高代码的可读性和重用性。还可以控制项能否被外部使用。
这里感觉模块类似于c++中的类。crate类似于c++中的模块。
模块中还可以定义模块,形成模块树,类似于电脑上的文件系统。

路径

路径用于引用模块树中的项,这里的路径类似于c++中的命名空间。也类似于python中的import
可以使用use关键字将名称引入作用域。
习惯:
把函数的父模块引入作用域。使用 use 引入结构体、枚举和其他项时,习惯是指定它们的完整路径

使用as重命名

  1. use std::io::Result as IoResult

使用pub use重导出名称

  1. pub use create::front_of_house::hosting

总结

Rust提供了将包分为多个crate(类似于c++中多个源文件),将crate分成模块(类似于c++中的类),
以及通过指定绝对/相对路径从一个模块引用另一个模块的项。可以通过use语句将路径引入作用域,这样在多次使用时可以使用更短的路径。模块定义的代码默认是私有的,可以通过增加pub关键字使其定义变为公有。