模块

package

package 是一个或多个 crate 组成的集合. Cargo 项目是一个包.

一个包能包含一个或多个二进制项，但只能包含一个库。这是为啥？？要发布的原因吗。要创建其他二进制项，将文件放在 src/bin 目录下即可被编译成独立的二进制文件.

crate

crate 分为二进制项和库, Cargo 创建的默认模板就只包含一个二进制项，约定 src/main.rs 是入口根文件. Cargo 还约定 src/lib.rs 为库的根文件.

编译一个 crate 从根文件开始寻找需要的代码.

mod

mod 用来将 crate 的代码分组，也可以为模块创建子模块，模块中的代码默认私有.

Copy
mod web {
mod client {
mod home {}
fn get_env() {}
}
mod server {
struct DTO {
id: String
}
}
}

路径

绝对路径 由 crate 名 (同一个 crate 使用 crate) 开头的全路径.

相对路径 从当前模块出发使用 self, super 和模块名定位的路径.

use

使用 use 关键字引入可访问模块即可直接使用该模块作用域的内容，和 JS 的 import 类似.

对于函数的引入，习惯引入其父模块并在调用时指定，有些 call(this) 的感觉.

对于结构体、枚举等，习惯引用完整路径并直接使用.

Copy
use web::client;

use web::server::DTO;

client.get_env();

DTO {
id: String::from(""),
};
// 重导出
pub use web::server;
// 嵌套引入
use web::{self, server::DTO};
// 引入 web 所有公开子模块
use web::*;

模块文件

把一个大的模块拆分为多个文件更有利于阅读，和前端模块化的思路一致.

Copy
web
├── client
│ └── home.rs
└── server.rs