Rust 实践指南
第一部分 配置和工具
1.
前言
1.1.
Rust 语言的优势
1.2.
本书编撰原因和主要内容
1.3.
结语
2.
阅读建议
2.1.
本书目标读者
2.2.
如何阅读本书
3.
环境配置
3.1.
配置 Rust 工具链的国内源
3.2.
Linux/WSL/macOS 配置 Rust 环境
3.2.1.
命令方式安装 Rust
3.2.2.
Homebrew 安装 Rust
3.3.
Windows 配置 Rust 环境
3.3.1.
安装 Microsoft C++ 生成工具
3.3.2.
rustup 安装器
3.4.
更新和卸载
3.5.
编辑器、IDE
3.5.1.
编辑器及其扩展
3.5.2.
IDE 及其插件
4.
Cargo 工具
4.1.
配置 cargo 国内镜像源
4.2.
使用 cargo 管理 crate
4.3.
使用 cargo 构建项目
4.3.1.
创建项目
4.3.2.
编译和运行项目
4.3.3.
发布项目
4.4.
使用 cargo 构建本书实例
第二部分 实践和讨论
5.
算法
5.1.
生成随机值
5.1.1.
生成随机数
5.1.2.
生成范围内随机数
5.1.3.
生成给定分布随机数
5.1.4.
生成自定义类型随机值
5.1.5.
从字母数字字符创建随机密码
5.1.6.
从用户定义字符创建随机密码
5.1.7.
随机值 crates 小结
5.2.
Vector 排序
5.2.1.
整数 Vector 排序
5.2.2.
浮点数 Vector 排序
5.2.3.
结构体 Vector 排序
5.2.4.
Vector 排序 crates 小结
6.
命令行
6.1.
参数解析
6.1.1.
解析命令行参数
6.1.2.
参数解析 crates 小结
6.2.
ANSI 终端
6.2.1.
控制 ANSI 终端的颜色和格式
6.2.2.
ANSI 终端 crates 小结
7.
压缩
7.1.
使用 tar 包
7.1.1.
解压 tar 包
7.1.2.
压缩目录为 tar 包
7.1.3.
从路径移除前缀时,解压 tar 包
7.1.4.
使用 tar 包 crates 小结
8.
并发/并行
8.1.
显式线程
8.1.1.
生成短期线程
8.1.2.
创建并发的数据管道
8.1.3.
在两个线程间传递数据
8.1.4.
保持全局可变状态
8.1.5.
对所有 iso 文件的 SHA256 值并发求和
8.1.6.
将绘制分形的线程分派到线程池
8.1.7.
显式线程 crates 小结
8.2.
数据并行
8.2.1.
并行改变数组中元素
8.2.2.
并行测试集合中任意或所有的元素是否匹配给定断言
8.2.3.
使用给定断言并行搜索项
8.2.4.
对 vector 并行排序
8.2.5.
Map-reduce 并行计算
8.2.6.
并行生成 jpg 缩略图
8.2.7.
数据并行 crates 小结
9.
密码学
9.1.
散列(哈希)
9.1.1.
计算文件的 SHA-256 摘要
9.1.2.
使用 HMAC 摘要对消息进行签名和验证
9.1.3.
散列(哈希)crates 小结
9.2.
加密
9.2.1.
使用 PBKDF2 对密码进行加密(salt)和散列(hash)运算
9.2.2.
加密 crates 小结
10.
数据结构
10.1.
位域
10.1.1.
定义并操作位域风格的类型
10.1.2.
位域 crates 小结
11.
数据库
11.1.
驱动程序
11.1.1.
SQLite
11.1.1.1.
创建 SQLite 数据库
11.1.1.2.
数据插入和查询
11.1.1.3.
事务处理
11.1.2.
Postgres
11.1.2.1.
Postgres 数据库中创建表
11.1.2.2.
数据插入和查询
11.1.2.3.
数据聚合
11.1.3.
MySql
11.1.4.
MongoDB
11.1.5.
驱动程序 crates 小结
11.2.
ORM 工具
11.2.1.
diesel
11.2.2.
rbatis
11.2.3.
rustorm
11.2.4.
sqlx
11.2.5.
ORM 工具 crates 小结
12.
日期及时间
12.1.
期间和计算
12.1.1.
测量运行时间
12.1.2.
执行日期检查和时间计算
12.1.3.
时间的时区转换
12.2.
解析与显示
12.2.1.
检查日期和时间
12.2.2.
日期和 UNIX 时间戳的互相转换
12.2.3.
日期和时间的格式化显示
12.2.4.
将字符串解析为 DateTime 结构体
12.3.
日期及时间 crates 小结
13.
开发工具
13.1.
调试工具
13.1.1.
日志工具
13.1.1.1.
记录调试信息到控制台
13.1.1.2.
记录错误信息到控制台
13.1.1.3.
记录信息时,用标准输出 stdout 替换标准错误 stderr
13.1.1.4.
使用自定义日志记录器记录信息
13.1.1.5.
记录到 Unix 系统日志
13.1.1.6.
启用每个模块的日志级别
13.1.1.7.
用自定义环境变量设置日志记录
13.1.1.8.
在日志信息中包含时间戳
13.1.1.9.
将信息记录到自定义位置
13.1.1.10.
日志工具 crates 小结
13.2.
版本控制
13.2.1.
解析并递增版本字符串
13.2.2.
解析复杂的版本字符串
13.2.3.
检查给定版本是否为预发布版本
13.2.4.
查询适配给定范围的最新版本
13.2.5.
检查外部命令的版本兼容性
13.2.6.
版本控制 crates 小结
13.3.
构建工具
13.3.1.
编译并静态链接到绑定的 C 语言库
13.3.2.
编译并静态链接到绑定的 C++ 语言库
13.3.3.
编译 C 语言库时自定义设置
13.3.4.
构建工具 crates 小结
14.
编码
14.1.
字符集
14.1.1.
百分比编码(URL 编码)字符串
14.1.2.
将字符串编码为 application/x-www-form-urlencoded
14.1.3.
编码和解码十六进制
14.1.4.
编码和解码 base64
14.1.5.
字符集 crates 小结
14.2.
CSV 处理
14.2.1.
读取 CSV 记录
14.2.2.
读取有不同分隔符的 CSV 记录
14.2.3.
筛选匹配断言的 CSV 记录
14.2.4.
用 Serde 处理无效的 CSV 数据
14.2.5.
将记录序列化为 CSV
14.2.6.
用 Serde 将记录序列化为 CSV
14.2.7.
转换 CSV 文件的列
14.2.8.
CSV 处理 crates 小结
14.3.
结构化数据
14.3.1.
对非结构化 JSON 序列化和反序列化
14.3.2.
反序列化 TOML 配置文件
14.3.3.
以小端模式(低位模式)字节顺序读写整数
14.3.4.
结构化数据 crates 小结
15.
错误处理
15.1.
处理错误变量
15.1.1.
在 main 方法中对错误适当处理
15.1.2.
避免在错误转变过程中遗漏错误
15.1.3.
获取复杂错误场景的回溯
15.2.
错误处理 crates 小结
16.
文件系统
16.1.
文件读写
16.1.1.
读取文件的字符串行
16.1.2.
避免读取写入同一文件
16.1.3.
使用内存映射随机访问文件
16.2.
目录遍历
16.2.1.
过去 24 小时内修改过的文件名
16.2.2.
查找给定路径的循环
16.2.3.
递归查找重名文件
16.2.4.
使用给定断言递归查找所有文件
16.2.5.
跳过隐藏文件遍历目录
16.2.6.
在给定深度的目录,递归计算文件大小
16.2.7.
递归查找所有 png 文件
16.2.8.
忽略文件名大小写,使用给定模式查找所有文件
16.3.
文件系统 crates 小结
17.
硬件支持
17.1.
处理器
17.1.1.
检查逻辑 cpu 内核的数量
17.2.
硬件支持 crates 小结
18.
内存管理
18.1.
全局静态/全局堆栈
18.1.1.
声明延迟计算常量
18.2.
内存管理 crates 小结
19.
网络
19.1.
服务器
19.1.1.
监听未使用的 TCP/IP 端口
19.1.2.
服务器 crates 小结
20.
操作系统
20.1.
外部命令
20.1.1.
运行外部命令并处理 stdout
20.1.2.
运行传递 stdin 的外部命令,并检查错误代码
20.1.3.
运行管道传输的外部命令
20.1.4.
将子进程的 stdout 和 stderr 重定向到同一个文件
20.1.5.
持续处理子进程的输出
20.1.6.
读取环境变量
20.2.
操作系统 crates 小结
21.
科学计算
21.1.
数学
21.1.1.
线性代数
21.1.1.1.
矩阵相加
21.1.1.2.
矩阵相乘
21.1.1.3.
标量、vector、矩阵相乘
21.1.1.4.
Vector 比较
21.1.1.5.
Vector 范数
21.1.1.6.
矩阵求逆
21.1.1.7.
(反)序列化矩阵
21.1.2.
三角学
21.1.2.1.
计算三角形的边长
21.1.2.2.
验证正切(tan)等于正弦(sin)除以余弦(cos)
21.1.2.3.
地球上两点之间的距离
21.1.3.
复数
21.1.3.1.
创建复数
21.1.3.2.
复数相加
21.1.3.3.
复数的数学函数
21.1.4.
统计学
21.1.4.1.
集中趋势度量
21.1.4.2.
计算标准偏差
21.1.5.
其它数学计算
21.1.5.1.
大数
21.1.6.
数学 crates 小结
22.
文本处理
22.1.
正则表达式
22.1.1.
验证并提取电子邮件登录信息
22.1.2.
从文本提取标签元素唯一的列表
22.1.3.
从文本提取电话号码
22.1.4.
通过匹配多个正则表达式来筛选日志文件
22.1.5.
文本模式替换
22.2.
字符串解析
22.2.1.
收集 Unicode 字符
22.2.2.
自定义结构体并实现 FromStr trait
22.3.
文本处理 crates 小结
23.
Web 编程
23.1.
提取链接
23.1.1.
从 HTML 网页中提取所有链接
23.1.2.
检查网页死链
23.1.3.
从 MediaWiki 标记页面提取所有唯一性链接
23.1.4.
提取链接 crates 小结
23.2.
URL
23.2.1.
解析 URL 字符串为 Url 类型
23.2.2.
通过移除路径段创建基本 URL
23.2.3.
从基本 URL 创建新 URLs
23.2.4.
提取 URL 源(scheme/ host/ port)
23.2.5.
从 URL 移除片段标识符和查询对
23.2.6.
URL crates 小结
23.3.
媒体类型(MIME)
23.3.1.
从字符串获取 MIME 类型
23.3.2.
从文件名获取 MIME 类型
23.3.3.
解析 HTTP 响应的 MIME 类型
23.3.4.
媒体类型(MIME)crates 小结
23.4.
电子邮件
23.5.
客户端
23.5.1.
请求处理
23.5.1.1.
发出 HTTP GET 请求
23.5.1.2.
为 REST 请求设置自定义消息标头和 URL 参数
23.5.2.
Web API 调用
23.5.2.1.
查询 GitHub API
23.5.2.2.
检查 API 资源是否存在
23.5.2.3.
使用 GitHub API 创建和删除 Gist
23.5.2.4.
使用 RESTful API 分页
23.5.2.5.
处理速率受限 API
23.5.3.
下载
23.5.3.1.
下载文件到临时目录
23.5.3.2.
使用 HTTP range 请求头进行部分下载
23.5.3.3.
POST 文件到 paste-rs
23.5.4.
客户端 crates 小结
第三部分 进阶和延伸
24.
源码编译安装 Rust
25.
Rust 构建进阶
25.1.
Cargo 进阶
25.1.1.
Cargo 清单格式详解
25.1.2.
Cargo 文件和依赖项管理
25.1.3.
项目的构建过程
25.1.4.
使用 Cargo 发布 crate
25.1.5.
Cargo 构建脚本
25.1.6.
Cargo 外部工具
25.1.7.
Cargo 常见问题
26.
Rust 模糊测试
26.1.
使用 fuzz 进行模糊测试
26.2.
使用 afl.rs 进行模糊测试
27.
书籍构建工具 mdBook
Light (default)
Rust
Coal
Navy
Ayu
Rust 实践指南 - The Hitchhiker's Guide to Rust
书馆
8.2. 数据并行
并行改变数组中元素
并行测试集合中任意或所有的元素是否匹配给定断言
使用给定断言并行搜索项
对 vector 并行排序
Map-reduce 并行计算
并行生成 jpg 缩略图
数据并行 crates 小结