package#
package 是一个或多个 crate 组成的集合. Cargo 项目是一个包.
一个包能包含一个或多个二进制项,但只能包含一个库。这是为啥??要发布的原因吗。要创建其他二进制项,将文件放在 src/bin 目录下即可被编译成独立的二进制文件.
crate#
crate 分为二进制项和库, Cargo 创建的默认模板就只包含一个二进制项,约定 src/main.rs 是入口根文件. Cargo 还约定 src/lib.rs 为库的根文件.
编译一个 crate 从根文件开始寻找需要的代码.
mod#
mod 用来将 crate 的代码分组,也可以为模块创建子模块,模块中的代码默认私有.
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)
的感觉. - 对于结构体、枚举等,习惯引用完整路径并直接使用.
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::*;
模块文件#
把一个大的模块拆分为多个文件更有利于阅读,和前端模块化的思路一致.
web
├── client
│ └── home.rs
└── server.rs