rust
2025年1月1日
Code Like a Pro in Rust
假装一个Rust专家

Code Like a Pro in Rust
书中涵盖了Rust编程的方方面面,从基础概念如Cargo项目管理、Rust工具链的使用,到进阶主题如内存管理、单元测试、异步编程以及性能优化。代码示例丰富, 并提供在线及GitHub资源方便读者学习和实践。 书中还对比了Rust与其他编程语言的特性,并对Rust生态系统中的常用工具进行了详细介绍。
本书对 Rust 初学者合适,没有介绍高深的Rust概念。
好的,这是一份按照章节对《Code Like a Pro in Rust》这本书的总结和摘要,着重于关键概念和信息,以中文呈现:
前言
作者Brenden Matthews热爱学习新的编程语言,并指出Rust在很多方面都是一门独特的语言,引入了一些即使有多年编程经验的人也可能从未见过的概念。本书旨在帮助读者克服学习Rust的障碍,并成为一名更专业的Rust程序员。
第一章:感受 Rust
- Rust 是什么? Rust 是一种现代编程语言,专注于性能和安全。它拥有现代编程语言的特性,如闭包、泛型、异步 I/O、强大的工具、IDE 集成、代码检查器和风格检查工具。Rust 拥有一个充满活力且不断增长的开发者社区。Rust 主要用于构建系统级代码和安全及性能至关重要的库。它也可以用于其他领域,如使用 WebAssembly(Wasm)进行 Web 编程。
- Rust 的独特之处? Rust 通过一套独特的抽象来解决常见的编程错误。安全性是 Rust 的标志,它通过借用检查器提供强大的安全保证。Rust 的借用检查器在编译时验证引用,而不是在运行时进行垃圾回收。Rust 保证内存安全,不允许同时存在多个可变引用。Rust 的编译器 rustc 会检查对于任何给定的对象或变量,在同一时间只能有一个可变引用。可以有多个不可变引用,但不能有多个可变引用。Rust 还具有现代性、开源等特性。
- 何时使用 Rust? Rust 适用于多种应用场景,包括 Web 开发。
- 需要的工具:本书的代码示例可在互联网上公开获取。您需要安装 Git、rustup、gcc 或 clang。
第二章:使用 Cargo 进行项目管理
- Cargo 简介:Cargo 是 Rust 的构建系统和包管理器。
- 基本用法:使用
cargo new
创建新应用程序或库。Cargo 会自动初始化一个新的 Git 仓库。 - 构建、运行和测试:
cargo build
、cargo run
、cargo check
和cargo test
是常用的命令。 - 依赖管理:Cargo.toml 文件用于配置项目依赖项。可以使用语义化版本控制(SemVer)指定依赖项版本。
- Feature flags: 可以使用 feature flags 来表达可选的功能, 并通过
cfg
和cfg_attr
属性来控制编译。 - 发布包: 使用
cargo publish
发布到 crates.io。 - 文档化:使用
cargo doc
生成项目文档,文档格式使用 CommonMark。 - 工作区(Workspaces): 用于管理多个相关的包。
- 嵌入式环境中的 Rust 项目: Rust 适用于嵌入式编程,可以使用 QEMU 进行 Cortex-M 设备仿真。
第三章:Rust 工具
- Rust 工具概述:Rust 提供了多种工具来提高代码质量和生产力。
- rust-analyzer:用于 Rust IDE 集成的工具,提供代码补全等功能。
- rustfmt:用于代码格式化的工具,保持代码整洁。
- Clippy:用于提高代码质量的工具,提供超过 450 种代码质量检查 (lints)。可以配置 Clippy 的 lint 并自动应用建议。
- sccache:用于减少编译时间的编译器缓存。
- 与 IDE 集成: Rust 可以与各种 IDE 集成,包括 Visual Studio Code。
第四章:核心数据
- 数据结构:本章介绍了 Rust 的基本数据结构。
- 字符串:Rust 中有
str
、String
和&str
三种字符串类型。str
是栈分配的 UTF-8 字符串切片,不可变;String
是堆分配的 UTF-8 字符串,可变;&str
是对str
或String
的不可变引用。 - 切片和数组: 数组是固定长度的值序列,切片是指向内存连续区域的指针,包含长度。
- 向量(Vectors):
Vec
是可调整大小的通用容器,用于存储任何类型的值序列。 - 哈希映射 (HashMap):HashMap 用于存储键值对。
- 基本类型: Rust 的基本类型包括整数、大小类型和浮点类型。
- 原始类型的算术运算: Rust 默认情况下会检查算术运算的溢出。
第五章:内存管理
- 堆和栈:Rust 中的内存管理涉及堆和栈。堆用于动态分配内存,栈用于静态分配。
- 所有权:Rust 的所有权系统通过复制、借用、引用和移动来管理内存。
- 深拷贝: 当需要复制数据时,需要考虑深拷贝。
- 避免复制: 通过借用和引用可以避免不必要的复制。
- 智能指针:智能指针,如
Box
,用于在堆上分配数据。 - 引用计数:
Rc
和Arc
是引用计数的智能指针,用于实现共享所有权。 - 写时复制:写时复制是一种设计模式,在需要更改数据时会将其复制到新位置。
Cow
是一个智能指针,用于实现写时复制。 - 自定义分配器: 可以自定义内存分配器,以实现更精细的内存控制。
第六章:单元测试
- 单元测试:使用
#[test]
属性标记测试函数。 - 属性测试:使用
proptest
库进行属性测试。 - 代码覆盖率: 使用 Tarpaulin 工具生成代码覆盖率报告。
- 处理不断变化的生态系统:Rust 的生态系统不断改进和更新,需要注意向后和向前兼容性。
- 单元测试:使用
第七章:集成测试
- 集成测试:集成测试用于测试多个组件之间的交互。
- 集成测试策略:测试策略包括使用内置测试或外部集成测试,可以使用
assert_cmd
测试 CLI 应用程序。 - 模糊测试:模糊测试使用随机生成的数据来测试代码。
第八章:异步 Rust
- 异步 Rust: 异步 Rust 可以通过使用
async/await
关键字实现并发。 - 运行时:
Tokio
、async-std
和Smol
是常用的异步运行时。 - 异步思维:异步 I/O 是非阻塞的,而同步 I/O 是阻塞的。
- Futures:Futures 用于处理异步任务的结果。
#[tokio::main]
:#[tokio::main]
宏用于定义运行时。
- 异步 Rust: 异步 Rust 可以通过使用
第九章:构建 HTTP REST API 服务
- 选择 Web 框架:
axum
是一个用于构建 Web API 的框架 。 - 创建架构: Web 服务通常包括负载均衡器、Web 服务和状态服务(如数据库)。
- API 设计: API 路由定义了端点和请求方法。
- 库和工具: 使用
axum
、chrono
、serde
、sqlx
和tokio
等库。 - 应用脚手架:包括初始化追踪和日志、数据库连接以及定义路由。
- 数据建模: 使用 SQL 模式和 Rust 结构体来表示数据。
- 实现 API 路由:使用 axum 的 Router 定义 API 路由,并使用 extractors 处理请求。
- 错误处理: 使用
Error
枚举定义错误类型。 - 运行服务:可以使用
HTTPie
测试 API 服务。
- 选择 Web 框架:
第十章:构建 HTTP REST API 客户端
- 选择工具和库: 使用
Tokio
和hyper
库进行 HTTP 请求,clap
库用于命令行解析。 - 设计 CLI:CLI 设计包括定义命令和参数。
- 声明命令:使用
clap
的宏定义命令。 - 实现请求:使用
hyper
发送 HTTP 请求。 - 优雅地处理错误: 在
main
函数中使用?
操作符来处理错误。 - 测试 CLI: 可以使用 API 服务测试 CLI 的功能。
- 选择工具和库: 使用
第十一章:优化
- 优化策略: Rust 的零成本抽象允许编写快速代码。
- 使用 Rust 加速其他语言: 可以使用 Rust 加速其他语言的代码,例如 Python、Ruby、Elixir、JavaScript 和 Java。
- 需要注意的点:向量应预先分配所需的容量。使用
copy_from_slice()
方法在切片之间快速移动数据。
附录
- 介绍了如何使用
rustup
管理 Rust 工具链。
- 介绍了如何使用