Rust 基础
Rust 是注重内存安全与并发安全的系统级语言,通过所有权在编译期保证安全,无 GC。见 后端入门概览。
本章介绍工具链安装与 Cargo,从认识语言到写出第一个程序。
学习路径
| 顺序 | 主题 | 文档 |
|---|---|---|
| 1 | 安装、Cargo、第一个程序 | 本文 |
| 2 | 变量、标量、控制流 | 语法与类型 |
| 3 | 所有权、借用、生命周期 | 核心概念 |
| 4 | 结构体、枚举、集合 | 复合类型 |
| 5 | 泛型、trait | 泛型与 Trait |
| 6 | Result / Option | 错误处理 |
| 7 | 模块、crate、工作空间 | 包管理 |
| 8 | 线程、async | 异步 |
| 9 | 测试、cargo doc | 测试与文档 |
| 10 | 宏、unsafe、FFI | 进阶 |
1.1 Rust 是什么
系统编程语言:性能、安全、并发
Rust 的设计目标非常明确:像 C 和 C++ 那样对硬件有精细的控制力,同时在语言层面消除一大类常见错误。它天生适合编写操作系统、浏览器引擎、嵌入式固件、WebAssembly 模块、CLI 工具和高性能网络服务。
零成本抽象、无 GC、内存安全(通过所有权)
这三点是 Rust 最核心的承诺:
- 零成本抽象:高阶语法不会引入额外运行时开销。你用的迭代器、闭包在编译后通常能优化得和手写循环一样快。
- 无垃圾回收(GC):Rust 没有全局垃圾收集器,内存管理完全在编译期确定,保证了运行时的稳定低延迟。
- 内存安全:Rust 通过一套所有权概念,让编译器在编译时就能拒绝悬垂指针、二次释放、数据竞争等问题,无需垃圾回收器也不需要手动小心翼翼。
应用领域
除了上面提到的操作系统、嵌入式、WebAssembly、CLI、网络服务,Rust 也越来越多地出现在数据分析管道、区块链、游戏引擎甚至前端工具链中。其“一旦编译通过,就能安全稳定运行”的特性,特别适合需要长期维护的基础设施项目。
1.2 安装与配置
rustup:管理工具链
rustup 是 Rust 的官方安装器和工具链管理器。一行命令就能完成安装,并随时切换 stable、beta 或 nightly 通道。
在 Linux / macOS 上打开终端执行:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Windows 用户可以直接下载并运行 rustup-init.exe。
安装完成后,可以通过 rustup 查看、安装和切换工具链:
rustup toolchain list # 查看已安装的工具链
rustup default stable # 将 stable 设为默认
rustup update # 更新工具链
rustc 与 cargo
安装 Rust 后你会获得两个核心命令:
- rustc:Rust 编译器,可以直接把
.rs文件编译成可执行文件或库。 - cargo:Rust 的包管理与构建系统,负责创建项目、下载依赖、运行测试、生成文档等。
日常开发中几乎总是通过 cargo 与 Rust 交互,直接调用 rustc 的情况很少。
验证安装
rustc --version
cargo --version
如果两条命令都正常输出版本号,说明环境就绪。
编辑器 / IDE 推荐
- VS Code + rust-analyzer:安装 VS Code 后,在扩展市场搜索“rust-analyzer”并安装。它提供代码补全、实时错误提示、跳转定义、悬停类型等信息,是目前最主流的 Rust 开发环境。
- IntelliJ Rust:如果习惯 JetBrains 生态,使用 CLion 或 IntelliJ IDEA 并安装 Rust 插件,也能获得优秀的开发体验。
1.3 第一个程序
创建项目
cargo new hello_world
这条命令会生成一个名为 hello_world 的目录,包含:
hello_world
├── Cargo.toml # 项目清单文件
└── src
└── main.rs # 程序入口
- Cargo.toml:采用 TOML 格式,记录项目名称、版本、作者、依赖等信息。
- src/main.rs:默认的二进制入口文件。
打开 main.rs,你会看到:
fn main() {
println!("Hello, world!");
}
fn main()是 Rust 程序的入口点,每个可执行程序必须有且仅有一个main函数。println!是一个宏(以!结尾),而非普通函数。宏能生成重复代码或实现变长参数,println!是使用这类宏的最常见例子。
编译与运行
在项目目录下可以使用以下命令:
cargo run:编译并运行程序。如果代码未改动,下次会直接运行编译结果。cargo build:仅编译(默认创建 debug 版本),生成结果位于target/debug/。cargo check:快速检查代码是否可编译,但不生成最终可执行文件。适合开发过程中频繁验证语法和类型。
如果想编译为优化后的发布版本,可以加上 --release:
cargo build --release # 生成到 target/release/
release 版编译时间更长,但运行效率远高于 debug 版,适合最终分发。
1.4 Cargo 进阶
日常开发不仅仅是“编译运行”,Cargo 提供了一整套从依赖管理到发布的工作流。
Cargo.toml 与 Cargo.lock
- Cargo.toml:供开发者编辑的清单,声明了项目元数据和所需依赖的版本范围(例如
"0.8"表示兼容 0.8.x)。 - Cargo.lock:由 Cargo 自动生成,精确锁定了每一次构建中每个依赖的具体版本。二进制项目建议将
Cargo.lock提交版本控制,以保证所有环境和 CI 的构建一致性;库项目则通常不提交,由使用方自行解析。
添加依赖
有两种方式为项目添加依赖:
- 使用 cargo add(Rust 1.62.0 起内置):bash
cargo add serde # 添加最新版 serde cargo add tokio --features full # 添加时启用 features - 手动编辑 Cargo.toml:toml
[dependencies] serde = "1.0"
然后运行cargo build,Cargo 会自动下载并编译依赖。
包都发布在社区注册中心 crates.io,Cargo 默认从这里拉取。
构建配置:profile.dev / profile.release
在 Cargo.toml 中可以通过 [profile] 小节覆盖默认的编译选项:
[profile.dev]
opt-level = 0 # 无优化,编译快
debug = true # 包含调试信息
[profile.release]
opt-level = 3 # 最大化优化
debug = false # 不包含调试信息
你还可以调整 LTO、代码展开程度、溢出检查等,以满足不同场景的需求。
工作空间(workspace)
当项目逐渐庞大,可能拆分为多个相互依赖的 crate。工作空间能让它们共享同一个 Cargo.lock 和 target 目录,统一构建。
根目录的 Cargo.toml 声明工作空间成员:
[workspace]
members = [
"core",
"cli",
"web",
]
每个子目录都是独立的 crate(有自己的 Cargo.toml)。在根目录执行 cargo build 将一次性构建所有成员,并自动处理内部依赖。
常用命令速览
cargo test:运行项目中的单元测试、集成测试和文档测试。cargo doc --open:为所有依赖和本地代码生成 HTML 文档,并自动在浏览器中打开。文档注释///会被编译为漂亮文档页,这是 Rust 生态的优良传统。cargo publish:将 crate 发布到 crates.io。发布前需要先登录、确保清单信息完整。发布后,社区即可通过cargo add使用你的代码。
参考文献
以下链接在编写时均可正常访问:
| 资料 | 说明 |
|---|---|
| Rust 程序设计语言 | 官方书 |
| rustup | 工具链安装 |
| Cargo 手册 | 包管理 |
相关文章
第八章:测试、文档与质量
Rust 将测试和文档视为语言的一等公民。通过内置的测试框架,你可以在项目里编写单元测试、集成测试以及随文档一起运行的示例测试,三者共用 cargo test 命令。配合 cargo doc 生成文档,形成了一套确保代码质量与可维护性…
泛型与 Trait
泛型和 trait 是 Rust 实现代码复用与多态的两大支柱。前置:Rust 基础。泛型让代码可以工作在多种类型上而不牺牲性能,trait 定义了类型间的共享行为,二者结合形成了零成本抽象的强大表达能力。本章将深入泛型定义、trai…
第二章:基础语法与类型
Rust 的类型系统和语法设计处处体现着“安全”与“显式”的理念。这一章你将掌握变量绑定、基本类型、复合类型、函数定义以及所有基础控制流结构,它们是你写出任何 Rust 程序的基石。
第七章:模块系统与包管理
Rust 的模块系统为代码组织、封装和复用提供了一套严谨但灵活的机制。包、crate、模块以及 use 路径相互配合,让你能够把项目拆解成清晰的功能单元,同时精确控制哪些对外可见。本章将带你系统掌握这些构建大型 Rust 项目所必需的…
第十章:进阶特性与模式
Rust 的核心安全保证覆盖了绝大多数日常编程场景。但当你需要打破常规——无论是编写极致通用的抽象、与 C 库交互,还是内联优化——本章将带你进入 Rust 的深层能力:声明宏与过程宏、unsafe 的超能力与封装、高级类型系统技巧…
第五章:错误处理
Rust 将错误明确分为两类:不可恢复的错误与可恢复的错误。通过 panic! 处理前一种,Result 处理后一种,这让程序的错误路径不再是隐式的控制流,而是强类型、必须处理的代码分支。配合 Option 对缺失值的处理以及丰富的组…
Series
rust
2 / 10