Rust程序设计(第2版)
Jim Blandy, Jason Orendorff, Leonora F. S. Tindall
汪志成(@雪狼) 译
出版时间:2023年09月
页数:576
“对曾用其他语言进行过系统编程的读者来说,这本书能帮你以最快的速度掌握Rust。书中通过大量代码示例和项目讲解了Rust的工作原理。”
——Carol Nichols
《Rust权威指南》作者
Integer 32联合创始人

系统编程为算力世界提供了基石。要编写性能敏感的代码就需要一种新的系统编程语言——让程序员能够掌控内存、CPU时间和其他系统资源,Rust应运而生。Rust将这种掌控力与现代类型系统结合起来,以捕获各种常见错误:小到内存管理,大到线程之间的数据竞争。
本书是Rust领域的经典参考书,三位作者均为资深系统程序员。学完本书,读者就能在构建应用的过程中兼顾性能与安全。具体而言,充分利用Rust的特性,将可预知的性能、安全的内存访问和可靠的并发结合起来,对内存的消耗和处理器的使用进行全面掌控。
本书涉及的主要内容包括:
● Rust的基本数据类型,以及“所有权”和“借用”的核心概念
● 语言的基础,包括错误处理、crate与模块、结构体,以及枚举
● 利用特型和泛型写出既灵活又高效的代码
● Rust大杀器——闭包、迭代器和异步编程
● 集合、字符串与文本、输入与输出、并发、宏、不安全代码,以及与外部函数的接口
  1. 专家推荐
  2. 译者序
  3. 前言
  4. 中文版审读致谢
  5. 第1章 系统程序员也能享受美好
  6. 1.1 Rust为你负重前行
  7. 1.2 高效并行编程
  8. 1.3 性能毫不妥协
  9. 1.4 协作无边无界
  10. 第2章 Rust导览
  11. 2.1 rustup与Cargo
  12. 2.2 Rust函数
  13. 2.3 编写与运行单元测试
  14. 2.4 处理命令行参数
  15. 2.5 搭建Web服务器
  16. 2.6 并发
  17. 2.6.1 什么是曼德博集
  18. 2.6.2 解析并配对命令行参数
  19. 2.6.3 从像素到复数的映射
  20. 2.6.4 绘制曼德博集
  21. 2.6.5 写入图像文件
  22. 2.6.6 并发版曼德博程序
  23. 2.6.7 运行曼德博绘图器
  24. 2.6.8 大“安”无形
  25. 2.7 文件系统与命令行工具
  26. 2.7.1 命令行界面
  27. 2.7.2 读写文件
  28. 2.7.3 查找并替换
  29. 第3章 基本数据类型
  30. 3.1 固定宽度的数值类型
  31. 3.1.1 整型
  32. 3.1.2 检查算法、回绕算法、饱和算法和溢出算法
  33. 3.1.3 浮点类型
  34. 3.2 布尔类型
  35. 3.3 字符
  36. 3.4 元组
  37. 3.5 指针类型
  38. 3.5.1 引用
  39. 3.5.2 Box
  40. 3.5.3 裸指针
  41. 3.6 数组、向量和切片
  42. 3.6.1 数组
  43. 3.6.2 向量
  44. 3.6.3 切片
  45. 3.7 字符串类型
  46. 3.7.1 字符串字面量
  47. 3.7.2 字节串
  48. 3.7.3 内存中的字符串
  49. 3.7.4 String
  50. 3.7.5 使用字符串
  51. 3.7.6 其他类似字符串的类型
  52. 3.8 类型别名
  53. 3.9 前路展望
  54. 第4章 所有权与移动
  55. 4.1 所有权
  56. 4.2 移动
  57. 4.2.1 更多移动类操作
  58. 4.2.2 移动与控制流
  59. 4.2.3 移动与索引内容
  60. 4.3 Copy类型:关于移动的例外情况
  61. 4.4 Rc与Arc:共享所有权
  62. 第5章 引用
  63. 5.1 对值的引用
  64. 5.2 使用引用
  65. 5.2.1 Rust引用与C++引用
  66. 5.2.2 对引用变量赋值
  67. 5.2.3 对引用进行引用
  68. 5.2.4 比较引用
  69. 5.2.5 引用永不为空
  70. 5.2.6 借用任意表达式结果值的引用
  71. 5.2.7 对切片和特型对象的引用
  72. 5.3 引用安全
  73. 5.3.1 借用局部变量
  74. 5.3.2 将引用作为函数参数
  75. 5.3.3 把引用传给函数
  76. 5.3.4 返回引用
  77. 5.3.5 包含引用的结构体
  78. 5.3.6 不同的生命周期参数
  79. 5.3.7 省略生命周期参数
  80. 5.4 共享与可变
  81. 5.5 应对复杂对象关系
  82. 第6章 表达式
  83. 6.1 表达式语言
  84. 6.2 优先级与结合性
  85. 6.3 块与分号
  86. 6.4 声明
  87. 6.5 if与match
  88. 6.5.1 if let
  89. 6.5.2 循环
  90. 6.6 循环中的控制流
  91. 6.7 return表达式
  92. 6.8 为什么Rust中会有loop
  93. 6.9 函数与方法调用
  94. 6.10 字段与元素
  95. 6.11 引用运算符
  96. 6.12 算术运算符、按位运算符、比较运算符和逻辑运算符
  97. 6.13 赋值
  98. 6.14 类型转换
  99. 6.15 闭包
  100. 6.16 前路展望
  101. 第7章 错误处理
  102. 7.1 panic
  103. 7.1.1 展开调用栈
  104. 7.1.2 中止
  105. 7.2 Result
  106. 7.2.1 捕获错误
  107. 7.2.2 Result类型别名
  108. 7.2.3 打印错误
  109. 7.2.4 传播错误
  110. 7.2.5 处理多种Error类型
  111. 7.2.6 处理“不可能发生”的错误
  112. 7.2.7 忽略错误
  113. 7.2.8 处理main()中的错误
  114. 7.2.9 声明自定义错误类型
  115. 7.2.10 为什么是Result
  116. 第8章 crate与模块
  117. 8.1 crate
  118. 8.1.1 版本
  119. 8.1.2 创建配置文件
  120. 8.2 模块
  121. 8.2.1 嵌套模块
  122. 8.2.2 单独文件中的模块
  123. 8.2.3 路径与导入
  124. 8.2.4 标准库预导入
  125. 8.2.5 公开use声明
  126. 8.2.6 公开结构体字段
  127. 8.2.7 静态变量与常量
  128. 8.3 将程序变成库
  129. 8.4 src/bin目录
  130. 8.5 属性
  131. 8.6 测试与文档
  132. 8.6.1 集成测试
  133. 8.6.2 文档
  134. 8.6.3 文档测试
  135. 8.7 指定依赖项
  136. 8.7.1 版本
  137. 8.7.2 Cargo.lock
  138. 8.8 将crate发布到crates.io
  139. 8.9 工作空间
  140. 8.10 更多好资源
  141. 第9章 结构体
  142. 9.1 具名字段型结构体
  143. 9.2 元组型结构体
  144. 9.3 单元型结构体
  145. 9.4 结构体布局
  146. 9.5 用impl定义方法
  147. 9.5.1 以Box、Rc或Arc形式传入self
  148. 9.5.2 类型关联函数
  149. 9.6 关联常量
  150. 9.7 泛型结构体
  151. 9.8 带生命周期参数的泛型结构体
  152. 9.9 带常量参数的泛型结构体
  153. 9.10 让结构体类型派生自某些公共特型
  154. 9.11 内部可变性
  155. 第10章 枚举与模式
  156. 10.1 枚举
  157. 10.1.1 带数据的枚举
  158. 10.1.2 内存中的枚举
  159. 10.1.3 用枚举表示富数据结构
  160. 10.1.4 泛型枚举
  161. 10.2 模式
  162. 10.2.1 模式中的字面量、变量和通配符
  163. 10.2.2 元组型模式与结构体型模式
  164. 10.2.3 数组型模式与切片型模式
  165. 10.2.4 引用型模式
  166. 10.2.5 匹配守卫
  167. 10.2.6 匹配多种可能性
  168. 10.2.7 使用@模式绑定
  169. 10.2.8 模式能用在哪里
  170. 10.2.9 填充二叉树
  171. 10.3 大局观
  172. 第11章 特型与泛型
  173. 11.1 使用特型
  174. 11.1.1 特型对象
  175. 11.1.2 泛型函数与类型参数
  176. 11.1.3 使用哪一个
  177. 11.2 定义与实现特型
  178. 11.2.1 默认方法
  179. 11.2.2 特型与其他人的类型
  180. 11.2.3 特型中的Self
  181. 11.2.4 子特型
  182. 11.2.5 类型关联函数
  183. 11.3 完全限定的方法调用
  184. 11.4 定义类型之间关系的特型
  185. 11.4.1 关联类型(或迭代器的工作原理)
  186. 11.4.2 泛型特型(或运算符重载的工作原理)
  187. 11.4.3 impl Trait
  188. 11.4.4 关联常量
  189. 11.5 逆向工程求限界
  190. 11.6 以特型为基础
  191. 第12章 运算符重载
  192. 12.1 算术运算符与按位运算符
  193. 12.1.1 一元运算符
  194. 12.1.2 二元运算符
  195. 12.1.3 复合赋值运算符
  196. 12.2 相等性比较
  197. 12.3 有序比较
  198. 12.4 Index与IndexMut
  199. 12.5 其他运算符
  200. 第13章 实用工具特型
  201. 13.1 Drop
  202. 13.2 Sized
  203. 13.3 Clone
  204. 13.4 Copy
  205. 13.5 Deref与DerefMut
  206. 13.6 Default
  207. 13.7 AsRef与AsMut
  208. 13.8 Borrow与BorrowMut
  209. 13.9 From与Into
  210. 13.10 TryFrom与TryInto
  211. 13.11 ToOwned
  212. 13.12 Borrow与ToOwned的实际运用:谦卑的Cow
  213. 第14章 闭包
  214. 14.1 捕获变量
  215. 14.1.1 借用值的闭包
  216. 14.1.2 “窃取”值的闭包
  217. 14.2 函数与闭包的类型
  218. 14.3 闭包性能
  219. 14.4 闭包与安全
  220. 14.4.1 “杀死”闭包
  221. 14.4.2 FnOnce
  222. 14.4.3 FnMut
  223. 14.4.4 对闭包的Copy与Clone
  224. 14.5 回调
  225. 14.6 高效地使用闭包
  226. 第15章 迭代器
  227. 15.1 Iterator特型与IntoIterator特型
  228. 15.2 创建迭代器
  229. 15.2.1 iter方法与iter_mut方法
  230. 15.2.2 IntoIterator的实现
  231. 15.2.3 from_fn与successors
  232. 15.2.4 drain方法
  233. 15.2.5 其他迭代器源
  234. 15.3 迭代器适配器
  235. 15.3.1 map与filter
  236. 15.3.2 filter_map与flat_map
  237. 15.3.3 flatten
  238. 15.3.4 take与take_while
  239. 15.3.5 skip与skip_while
  240. 15.3.6 peekable
  241. 15.3.7 fuse
  242. 15.3.8 可逆迭代器与rev
  243. 15.3.9 inspect
  244. 15.3.10 chain
  245. 15.3.11 enumerate
  246. 15.3.12 zip
  247. 15.3.13 by_ref
  248. 15.3.14 cloned与copied
  249. 15.3.15 cycle
  250. 15.4 消耗迭代器
  251. 15.4.1 简单累加:count、sum和product
  252. 15.4.2 min与max
  253. 15.4.3 max_by与min_by
  254. 15.4.4 max_by_key与min_by_key
  255. 15.4.5 对条目序列进行比较
  256. 15.4.6 any与all
  257. 15.4.7 position、rposition和ExactSizeIterator
  258. 15.4.8 fold与rfold
  259. 15.4.9 try_fold与try_rfold
  260. 15.4.10 nth与nth_back
  261. 15.4.11 last
  262. 15.4.12 find、rfind和find_map
  263. 15.4.13 构建集合:collect与FromIterator
  264. 15.4.14 Extend特型
  265. 15.4.15 partition
  266. 15.4.16 for_each与try_for_each
  267. 15.5 实现自己的迭代器
  268. 第16章 集合
  269. 16.1 概述
  270. 16.2 Vec
  271. 16.2.1 访问元素
  272. 16.2.2 迭代
  273. 16.2.3 扩大向量与收缩向量
  274. 16.2.4 联结
  275. 16.2.5 拆分
  276. 16.2.6 交换
  277. 16.2.7 填充
  278. 16.2.8 排序与搜索
  279. 16.2.9 比较切片
  280. 16.2.10 随机元素
  281. 16.2.11 Rust中不存在失效型错误
  282. 16.3 VecDeque
  283. 16.4 BinaryHeap
  284. 16.5 HashMap与BTreeMap
  285. 16.5.1 条目
  286. 16.5.2 对Map进行迭代
  287. 16.6 HashSet与BTreeSet
  288. 16.6.1 对Set进行迭代
  289. 16.6.2 当相等的值不完全相同时
  290. 16.6.3 针对整个Set的运算
  291. 16.7 哈希
  292. 16.8 使用自定义哈希算法
  293. 16.9 在标准集合之外
  294. 第17章 字符串与文本
  295. 17.1 一些Unicode背景知识
  296. 17.1.1 ASCII、Latin-1和Unicode
  297. 17.1.2 UTF-8编码
  298. 17.1.3 文本方向性
  299. 17.2 字符(char)
  300. 17.2.1 字符分类
  301. 17.2.2 处理数字
  302. 17.2.3 字符大小写转换
  303. 17.2.4 与整数之间的转换
  304. 17.3 String与str
  305. 17.3.1 创建字符串值
  306. 17.3.2 简单探查
  307. 17.3.3 追加文本与插入文本
  308. 17.3.4 移除文本与替换文本
  309. 17.3.5 搜索与迭代的约定
  310. 17.3.6 搜索文本的模式
  311. 17.3.7 搜索与替换
  312. 17.3.8 遍历文本
  313. 17.3.9 修剪
  314. 17.3.10 字符串的大小写转换
  315. 17.3.11 从字符串中解析出其他类型
  316. 17.3.12 将其他类型转换为字符串
  317. 17.3.13 借用其他类似文本的类型
  318. 17.3.14 以UTF-8格式访问文本
  319. 17.3.15 从UTF-8数据生成文本
  320. 17.3.16 推迟分配
  321. 17.3.17 把字符串当作泛型集合
  322. 17.4 格式化各种值
  323. 17.4.1 格式化文本值
  324. 17.4.2 格式化数值
  325. 17.4.3 格式化其他类型
  326. 17.4.4 格式化值以进行调试
  327. 17.4.5 格式化指针以进行调试
  328. 17.4.6 按索引或名称引用参数
  329. 17.4.7 动态宽度与动态精度
  330. 17.4.8 格式化自己的类型
  331. 17.4.9 在自己的代码中使用格式化语言
  332. 17.5 正则表达式
  333. 17.5.1 Regex的基本用法
  334. 17.5.2 惰性构建正则表达式值
  335. 17.6 规范化
  336. 17.6.1 规范化形式
  337. 17.6.2 unicode-normalization crate
  338. 第18章 输入与输出
  339. 18.1 读取器与写入器
  340. 18.1.1 读取器
  341. 18.1.2 缓冲读取器
  342. 18.1.3 读取行
  343. 18.1.4 收集行
  344. 18.1.5 写入器
  345. 18.1.6 文件
  346. 18.1.7 寻址
  347. 18.1.8 其他读取器与写入器类型
  348. 18.1.9 二进制数据、压缩和序列化
  349. 18.2 文件与目录
  350. 18.2.1 OsStr与Path
  351. 18.2.2 Path与PathBuf的方法
  352. 18.2.3 访问文件系统的函数
  353. 18.2.4 读取目录
  354. 18.2.5 特定于平台的特性
  355. 18.3 网络
  356. 第19章 并发
  357. 19.1 分叉与合并并行
  358. 19.1.1 启动与联结
  359. 19.1.2 跨线程错误处理
  360. 19.1.3 跨线程共享不可变数据
  361. 19.1.4 rayon
  362. 19.1.5 重温曼德博集
  363. 19.2 通道
  364. 19.2.1 发送值
  365. 19.2.2 接收值
  366. 19.2.3 运行管道
  367. 19.2.4 通道的特性与性能
  368. 19.2.5 线程安全:Send与Sync
  369. 19.2.6 绝大多数迭代器能通过管道传给通道
  370. 19.2.7 除管道之外的用法
  371. 19.3 共享可变状态
  372. 19.3.1 什么是互斥锁
  373. 19.3.2 Mutex
  374. 19.3.3 mut与互斥锁
  375. 19.3.4 为什么互斥锁不是“银弹”
  376. 19.3.5 死锁
  377. 19.3.6 “中毒”的互斥锁
  378. 19.3.7 使用互斥锁的多消费者通道
  379. 19.3.8 读/写锁(RwLock)
  380. 19.3.9 条件变量(Condvar)
  381. 19.3.10 原子化类型
  382. 19.3.11 全局变量
  383. 19.4 在Rust中编写并发代码的一点儿经验
  384. 第20章 异步编程
  385. 20.1 从同步到异步
  386. 20.1.1 Future
  387. 20.1.2 异步函数与await表达式
  388. 20.1.3 从同步代码调用异步函数:block_on
  389. 20.1.4 启动异步任务
  390. 20.1.5 异步块
  391. 20.1.6 从异步块构建异步函数
  392. 20.1.7 在线程池中启动异步任务
  393. 20.1.8 你的Future实现Send了吗
  394. 20.1.9 长时间运行的计算:yield_now与spawn_blocking
  395. 20.1.10 对几种异步设计进行比较
  396. 20.1.11 一个真正的异步HTTP客户端
  397. 20.2 异步客户端与服务器
  398. 20.2.1 Error类型与Result类型
  399. 20.2.2 协议
  400. 20.2.3 获取用户输入:异步流
  401. 20.2.4 发送数据包
  402. 20.2.5 接收数据包:更多异步流
  403. 20.2.6 客户端的main函数
  404. 20.2.7 服务器的main函数
  405. 20.2.8 处理聊天连接:异步互斥锁
  406. 20.2.9 群组表:同步互斥锁
  407. 20.2.10 聊天组:tokio的广播通道
  408. 20.3 原始Future与执行器:Future什么时候值得再次轮询
  409. 20.3.1 调用唤醒器:spawn_blocking
  410. 20.3.2 实现block_on
  411. 20.4 固定(Pin)
  412. 20.4.1 Future生命周期的两个阶段
  413. 20.4.2 固定指针
  414. 20.4.3 Unpin特型
  415. 20.5 什么时候要用异步代码
  416. 第21章 宏
  417. 21.1 宏基础
  418. 21.1.1 宏展开的基础
  419. 21.1.2 意外后果
  420. 21.1.3 重复
  421. 21.2 内置宏
  422. 21.3 调试宏
  423. 21.4 构建json!宏
  424. 21.4.1 片段类型
  425. 21.4.2 宏中的递归
  426. 21.4.3 将特型与宏一起使用
  427. 21.4.4 作用域界定与卫生宏
  428. 21.4.5 导入宏和导出宏
  429. 21.5 在匹配过程中避免语法错误
  430. 21.6 超越macro_rules!
  431. 第22章 不安全代码
  432. 22.1 不安全因素来自哪里
  433. 22.2 不安全块
  434. 22.3 示例:高效的ASCII字符串类型
  435. 22.4 不安全函数
  436. 22.5 不安全块还是不安全函数
  437. 22.6 未定义行为
  438. 22.7 不安全特型
  439. 22.8 裸指针
  440. 22.8.1 安全地解引用裸指针
  441. 22.8.2 示例:RefWithFlag
  442. 22.8.3 可空指针
  443. 22.8.4 类型大小与对齐方式
  444. 22.8.5 指针运算
  445. 22.8.6 移动入和移动出内存
  446. 22.8.7 示例:GapBuffer
  447. 22.8.8 不安全代码中的panic安全性
  448. 22.9 用联合体重新解释内存
  449. 22.10 匹配联合体
  450. 22.11 借用联合体
  451. 第 23章 外部函数
  452. 23.1 寻找共同的数据表示
  453. 23.2 声明外部函数与变量
  454. 23.3 使用库中的函数
  455. 23.4 libgit2的裸接口
  456. 23.5 libgit2的安全接口
  457. 23.6 结论
书名:Rust程序设计(第2版)
译者:汪志成(@雪狼) 译
国内出版社:人民邮电出版社
出版时间:2023年09月
页数:576
书号:978-7-115-62181-8
原版书书名:Programming Rust, 2nd Edition
原版书出版商:O'Reilly Media
Jim Blandy
 
Jim Blandy,Mozilla软件工程师,拥有近40年编程经验和30年自由软件开发经验,是Subversion版本控制系统最初的设计者之一,曾在GNU Emacs、GNU Debugger等项目上工作。
 
 
Jason Orendorff
 
Jason Orendorff,GitHub工程师,专注开发尚未公开的Rust项目,曾在Mozilla参与Java Script引擎SpiderMonkey的开发。兴趣广泛,包括:语法学、烘焙、时间旅行,以及帮助人们理解复杂主题。
 
 
Leonora F. S. Tindall
 
莉奥诺拉·F. S. 廷德尔(Leonora F. S. Tindall),软件工程师、类型系统爱好者。她喜欢使用Rust等先进语言在一些关键领域构建健壮且适应性强的系统软件,特别是在医疗保健和数据所有权管理等领域。
 
 
购买选项
定价:179.80元
书号:978-7-115-62181-8
出版社:人民邮电出版社