代码组织结构
Rust
在语言层面提供了3个代码管理单元,分别是:
package
:一个package
可以视为一个项目,cargo new
命令创建的就是package
crate
:Rust
编译的最小单元,和java中的jar包类似,每个crate
中有一个Cargo.toml
文件来配置crate
相关信息 有可执行crate和库crate两种- 一个package可以包含多个crate,但最少要包含一个crate
- 一个package可以包含多个可执行crate,只能包含一个库crate
- src/main.rs是默认的根可执行crate,其他可执行crate放于src/bin目录下
- src/lib.rs是默认的根库crate
module
:模块,类似于其他语言中的命名空间(java中的package),一般是封装了某个具体功能的实现

模块
rust 使用 mod 关键词用来定义模块和引入模块,以 mod 关键字为起始,然后指定模块的名字,并且用大括号包围模块的主体
rust
// src/main.rs
mod add {
pub mod add_one {
pub fn add_one (base: u32) -> u32 {
base + 1
}
}
}
fn main() {
print!("{}", add::add_one::add_one(0));
}
模块拆分
拆分成文件
rust
- Cargo.toml
- src/
- add.rs
- main.rs
// src/add.rs
pub mod add_one {
pub fn add_one (base: u32) -> u32 {
base + 1
}
}
// src/main.rs
mod add;
fn main() {
print!("{}", add::add_one::add_one(0));
}
拆分成文件夹
rust
- Cargo.toml
- src
- add/
- add_one.rs
- mod.rs
- main.rs
// src/add/add_one.rs
pub fn add_one (base: u32) -> u32 {
base + 1
}
// src/add/mod.rs
pub mod add_one;
// src/main.rs
mod add;
fn main() {
print!("{}", add::add_one::add_one(0));
}
拆分成文件+文件夹
rust
- Cargo.toml
- src
- add/
- add_one.rs
- add.rs
- main.rs
// src/add/add_one.rs
pub fn add_one (base: u32) -> u32 {
base + 1
}
// src/add.rs
pub mod add_one;
// src/add.rs
pub mod add_one;
可见性
Rust 中的项(例如函数、结构体、枚举等)默认情况下是私有的,只能在同一个模块中访问。使用 pub
关键字可以将项设置为公共的,以便在其他模块中访问
rust
mod mxsm_module {
pub fn public_function() {
// 公共函数
}
fn private_function() {
// 私有函数
}
}
fn main() {
mxsm_module::public_function(); // 可以访问公共函数
// mxsm_module::private_function(); // 无法访问私有函数
}
use super self
Rust模块的引用有两种方式,相对路径的引用和绝对路径的引用。
绝对引用以crate
开头,可以把crate
理解为的代码的根模块。 相对引用有两个关键字,self
和super
,self
表示同级的模块,super
表示上一级的模块
在 Rust 中,可以使用 use 关键字引入模块和其内部的内容,以便在其他地方直接使用
rust
mod my_module {
pub fn greet() {
println!("Hello, world!");
}
}
// 在其他地方使用模块和函数
use my_module::greet;
fn main() {
greet(); // 调用模块内部的函数
}
cargo.toml
[package]
ini
[package]
name = "project_name" # 包名(必需,遵循crates.io命名规则)
version = "0.1.0" # 语义化版本号(必需)
authors = ["Alice <[email protected]>"] # 维护者列表(可选)
edition = "2021" # Rust版本(2015/2018/2021,默认2015)
description = "项目描述" # 简短说明(crates.io展示)
license = "MIT OR Apache-2.0" # 许可证标识符(crates.io必需)
repository = "https://github.com/..." # 代码仓库链接
keywords = ["web", "async"] # 分类关键词(最多5个)
categories = ["network"] # crates.io分类(https://crates.io/category_slugs)
readme = "README.md" # 自述文件路径(默认README.md)
documentation = "https://..." # 自定义文档链接
default-run = "bin_name" # 默认执行的可执行文件
依赖管理
普通依赖
ini
[dependencies]
serde = "1.0" # 从 crates.io 安装最新 1.x 版
reqwest = { version = "0.11", features = ["json"] } # 启用特定特性
uuid = { git = "https://github.com/uuid-rs/uuid", rev = "dffd9f9" } # Git依赖
pathlib = { path = "../pathlib" } # 本地路径依赖
开发依赖
ini
[dev-dependencies] # 测试/示例/基准测试专用
tokio = { version = "1.0", features = ["full"] }
[build-dependencies] # 构建脚本(build.rs)专用
cc = "1.0"
平台特定依赖
ini
[target.'cfg(windows)'.dependencies]
winapi = "0.3"
[target.'cfg(unix)'.dependencies]
libc = "0.2"
[features] [workspace]
ini
[features]
default = ["ssl"] # 默认启用的特性
ssl = ["openssl"] # 特性可组合其他依赖
postgres = ["dep/postgres"]
[workspace]
members = ["crates/*"] # 包含的子crate路径
exclude = ["crates/old"] # 排除的目录
resolver = "2" # 依赖解析器版本(Cargo特性)
构建管理
ini
[lib]
name = "mylib" # 库名称(默认与包名相同)
path = "src/lib.rs" # 入口文件路径
crate-type = ["cdylib"] # 编译类型(lib/dylib/cdylib/rlib等)
[[bin]]
name = "main" # 可执行文件名
path = "src/main.rs" # 入口文件路径
test = true # 是否参与测试(默认true)
bench = false # 是否参与基准测试
[profile.dev]
opt-level = 0 # 调试模式(默认)
[profile.release]
opt-level = 3 # 发布模式优化
lto = true # 链接时优化
codegen-units = 1 # 代码生成单元数
脚本与元数据
构建脚本 build = "build.rs" # 指定构建脚本(默认build.rs)
自定义扩展数据(被工具使用): [package.metadata.docs.rs] features = ["full"] # 文档生成配置示例