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