一个包可以包含多个二进制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。
cargo new my-pro
//my-pro 目录
Cargo.toml
src
main.rs
Cargo.toml阐述了如何构建包里面的crate
my-pro包里面只包含一个crate main.rs 这是一个和包同名的二进制crate的根
crate根文件由Cargo传递给rustc 构建库或者二进制项目
定义模块来控制作用域与私有性
模块让我们能够将一个crate中的代码分组,提高代码的可读性和重用性。还可以控制项能否被外部使用。
这里感觉模块类似于c++中的类。crate类似于c++中的模块。
模块中还可以定义模块,形成模块树,类似于电脑上的文件系统。
路径
路径用于引用模块树中的项,这里的路径类似于c++中的命名空间。也类似于python中的import
可以使用use关键字将名称引入作用域。
习惯:
把函数的父模块引入作用域。使用 use 引入结构体、枚举和其他项时,习惯是指定它们的完整路径
使用as重命名
use std::io::Result as IoResult
使用pub use重导出名称
pub use create::front_of_house::hosting
总结
Rust提供了将包分为多个crate(类似于c++中多个源文件),将crate分成模块(类似于c++中的类),
以及通过指定绝对/相对路径从一个模块引用另一个模块的项。可以通过use语句将路径引入作用域,这样在多次使用时可以使用更短的路径。模块定义的代码默认是私有的,可以通过增加pub关键字使其定义变为公有。