Rust程序设计
Jim Blandy, Jason Orendorff
李松峰 译
出版时间:2020年09月
页数:476
Rust是一门新的系统编程语言,兼具C和C++的高性能和底层控制能力,而且能保证内存安全和线程安全,是系统编程发展史上的一个巨大进步。本书对Rust进行了全面介绍,详细解释了这门语言的重要概念,并提供了大量清晰易懂的示例,逐步指导读者用Rust编写出既安全又高性能的程序。
本书由两位具有数十年经验的系统程序员撰写,他们不仅分享了自己对Rust的深刻见解,而且还提供了一些建议和操作实践,对Rust开发者和系统程序员十分有帮助。
● Rust如何在内存中表示值(辅以图表)
● 完整解释了所有权、转移、借用和生命期
● Cargo、rustdoc、单元测试,以及如何在Rust公共包仓库上发布代码
● 泛型代码、闭包、集合和迭代器等高级特性
● Rust中的并发:线程、互斥量、通道和原子操作
● 不安全代码,以及如何保持使用常规代码的完整性
● 用丰富的例子展示了Rust各方面特性的综合运用
  1. 前言
  2. 第1章 为什么是Rust 
  3. 第2章 Rust初体验 
  4. 2.1 下载和安装Rust 
  5. 2.2 一个简单的函数 
  6. 2.3 编写和运行单元测试 
  7. 2.4 处理命令行参数 
  8. 2.5 一个简单的Web服务器 
  9. 2.6 并发 
  10. 2.6.1 到底什么是曼德布洛特集合 
  11. 2.6.2 解析成对的命令行参数 
  12. 2.6.3 像素到复数的映射 
  13. 2.6.4 绘制集合 
  14. 2.6.5 写出图像文件 
  15. 2.6.6 并发的曼德布洛特程序 
  16. 2.6.7 运行曼德布洛特绘图器 
  17. 2.6.8 安全无形 
  18. 第3章 基本类型 
  19. 3.1 机器类型 
  20. 3.1.1 整数类型 
  21. 3.1.2 浮点类型 
  22. 3.1.3 布尔类型 
  23. 3.1.4 字符类型 
  24. 3.2 元组 
  25. 3.3 指针类型 
  26. 3.3.1 引用 
  27. 3.3.2 Box 
  28. 3.3.3 原始指针 
  29. 3.4 数组、向量和切片 
  30. 3.4.1 数组 
  31. 3.4.2 向量 
  32. 3.4.3 逐个元素地构建向量 
  33. 3.4.4 切片 
  34. 3.5 字符串类型 
  35. 3.5.1 字符串字面量
  36. 3.5.2 字节字符串 
  37. 3.5.3 字符串在内存中的表示 
  38. 3.5.4 字符串 
  39. 3.5.5 使用字符串 
  40. 3.5.6 其他类似字符串的类型 
  41. 3.6 更多类型 
  42. 第4章 所有权 
  43. 4.1 所有权 
  44. 4.2 转移 
  45. 4.2.1 更多转移操作 
  46. 4.2.2 转移与控制流 
  47. 4.2.3 转移与索引内容 
  48. 4.3 Copy类型:转移的例外 
  49. 4.4 Rc和Arc:共享所有权 
  50. 第5章 引用 
  51. 5.1 引用作为值 
  52. 5.1.1 Rust引用与C++引用 
  53. 5.1.2 给引用赋值 
  54. 5.1.3 引用的引用 
  55. 5.1.4 比较引用 
  56. 5.1.5 引用永远不为空 
  57. 5.1.6 借用对任意表达式的引用 
  58. 5.1.7 对切片和特型对象的引用 
  59. 5.2 引用安全 
  60. 5.2.1 借用局部变量 
  61. 5.2.2 接收引用作为参数 
  62. 5.2.3 将引用作为参数传递 
  63. 5.2.4 返回引用 
  64. 5.2.5 结构体包含引用 
  65. 5.2.6 不同的生命期参数 
  66. 5.2.7 省略生命期参数 
  67. 5.3 共享与修改 
  68. 5.4 征服对象之海 
  69. 第6章 表达式 
  70. 6.1 表达式语言 
  71. 6.2 块与分号 
  72. 6.3 声明 
  73. 6.4 if与match 
  74. 6.5 循环 
  75. 6.6 return表达式 
  76. 6.7 为什么Rust有循环 
  77. 6.8 函数与方法调用 
  78. 6.9 字段与元素 
  79. 6.10 引用操作符 
  80. 6.11 算术、位、比较和逻辑操作符 
  81. 6.12 赋值 
  82. 6.13 类型转换 
  83. 6.14 闭包 
  84. 6.15 优先级与关联性 
  85. 6.16 展望 
  86. 第7章 错误处理 
  87. 7.1 诧异 
  88. 7.1.1 展开栈 
  89. 7.1.2 中止进程 
  90. 7.2 结果 
  91. 7.2.1 捕获错误 
  92. 7.2.2 结果类型别名 
  93. 7.2.3 打印错误 
  94. 7.2.4 传播错误 
  95. 7.2.5 处理多种错误类型 
  96. 7.2.6 处理“不会发生”的错误 
  97. 7.2.7 忽略错误 
  98. 7.2.8 在main()中处理错误 
  99. 7.2.9 声明自定义错误类型 
  100. 7.2.10 为什么是结果 
  101. 第8章 包和模块 
  102. 8.1 包 
  103. 8.2 模块 
  104. 8.2.1 把模块写在单独的文件中 
  105. 8.2.2 路径和导入 
  106. 8.2.3 标准前置模块 
  107. 8.2.4 特性项,Rust的基础 
  108. 8.3 将程序作为库发布 
  109. 8.4 src/bin目录 
  110. 8.5 属性 
  111. 8.6 测试和文档 
  112. 8.6.1 集成测试 
  113. 8.6.2 文档 
  114. 8.6.3 文档测试 
  115. 8.7 指定依赖 
  116. 8.7.1 版本 
  117. 8.7.2 Cargo.lock 
  118. 8.8 把包发布到crates.io 
  119. 8.9 工作空间 
  120. 8.10 还有惊喜 
  121. 第9章 结构体 
  122. 9.1 命名字段结构体 
  123. 9.2 类元组结构体 
  124. 9.3 类基元结构体 
  125. 9.4 结构体布局 
  126. 9.5 通过impl定义方法 
  127. 9.6 泛型结构体 
  128. 9.7 带生命期参数的结构体 
  129. 9.8 为结构体类型派生共有特型 
  130. 9.9 内部修改能力 
  131. 第10章 枚举与模式 
  132. 10.1 枚举 
  133. 10.1.1 包含数据的枚举 
  134. 10.1.2 枚举的内存布局 
  135. 10.1.3 使用枚举的富数据结构 
  136. 10.1.4 泛型枚举 
  137. 10.2 模式 
  138. 10.2.1 模式中的字面量、变量和通配符 
  139. 10.2.2 元组与结构体模式 
  140. 10.2.3 引用模式 
  141. 10.2.4 匹配多种可能性 
  142. 10.2.5 模式护具 
  143. 10.2.6 @模式 
  144. 10.2.7 在哪里使用模式 
  145. 10.2.8 填充二叉树 
  146. 10.3 设计的考量 
  147. 第11章 特型与泛型 
  148. 11.1 使用特型 
  149. 11.1.1 特型目标 
  150. 11.1.2 特型目标布局 
  151. 11.1.3 泛型函数 
  152. 11.1.4 使用哪一个 
  153. 11.2 定义和实现特型 
  154. 11.2.1 默认方法 
  155. 11.2.2 特型与其他人的类型 
  156. 11.2.3 特型中的Self 
  157. 11.2.4 子特型 
  158. 11.2.5 静态方法 
  159. 11.3 完全限定方法调用 
  160. 11.4 定义类型关系的特型 
  161. 11.4.1 关联类型(或迭代器工作原理) 
  162. 11.4.2 泛型特型(或操作符重载的原理) 
  163. 11.4.3 伴型特型(或rand::random()工作原理) 
  164. 11.5 逆向工程绑定 
  165. 11.6 小结 
  166. 第12章 操作符重载 
  167. 12.1 算术与位操作符 
  168. 12.1.1 一元操作符 
  169. 12.1.2 二元操作符 
  170. 12.1.3 复合赋值操作符 
  171. 12.2 相等测试 
  172. 12.3 顺序比较 
  173. 12.4 Index与IndexMut 
  174. 12.5 其他操作符 
  175. 第13章 实用特型 
  176. 13.1 Drop 
  177. 13.2 Sized 
  178. 13.3 Clone 
  179. 13.4 Copy 
  180. 13.5 Deref与DerefMut 
  181. 13.6 Default 
  182. 13.7 AsRef与AsMut 
  183. 13.8 Borrow与BorrowMut 
  184. 13.9 From与Into 
  185. 13.10 ToOwned 
  186. 13.11 Borrow与ToOwned实例:谦逊的奶牛(Cow) 
  187. 第14章 闭包 
  188. 14.1 捕获变量 
  189. 14.1.1 借用值的闭包 
  190. 14.1.2 盗用值的闭包 
  191. 14.2 函数与闭包类型 
  192. 14.3 闭包的性能 
  193. 14.4 闭包和安全 
  194. 14.4.1 杀值的闭包 
  195. 14.4.2 FnOnce 
  196. 14.4.3 FnMut 
  197. 14.5 回调 
  198. 14.6 有效使用闭包 
  199. 第15章 迭代器 
  200. 15.1 Iterator和IntoIterator特型 
  201. 15.2 创建迭代器 
  202. 15.2.1 iter和iter_mut方法 
  203. 15.2.2 IntoIterator实现 
  204. 15.2.3 drain方法 
  205. 15.2.4 其他迭代器源 
  206. 15.3 迭代器适配器 
  207. 15.3.1 map和filter 
  208. 15.3.2 filter_map和flat_map 
  209. 15.3.3 scan 
  210. 15.3.4 take和take_while 
  211. 15.3.5 skip和skip_while 
  212. 15.3.6 peekable 
  213. 15.3.7 fuse 
  214. 15.3.8 可逆迭代器与rev 
  215. 15.3.9 inspect 
  216. 15.3.10 chain 
  217. 15.3.11 enumerate 
  218. 15.3.12 zip 
  219. 15.3.13 by_ref 
  220. 15.3.14 cloned 
  221. 15.3.15 cycle 
  222. 15.4 消费迭代器 
  223. 15.4.1 简单累计:count、sum和product 
  224. 15.4.2 max和min 
  225. 15.4.3 max_by和min_by 
  226. 15.4.4 max_by_key和min_by_key 
  227. 15.4.5 比较项序列 
  228. 15.4.6 any和all 
  229. 15.4.7 position、rposition和ExactSizeIterator 
  230. 15.4.8 fold 
  231. 15.4.9 nth 
  232. 15.4.10 last 
  233. 15.4.11 find 
  234. 15.4.12 构建集合:collect和FromIterator 
  235. 15.4.13 Extend特型 
  236. 15.4.14 partition 
  237. 15.5 实现自己的迭代器 
  238. 第16章 集合 
  239. 16.1 概述 
  240. 16.2 Vec 
  241. 16.2.1 访问元素 
  242. 16.2.2 迭代 
  243. 16.2.3 增长和收缩向量 
  244. 16.2.4 连接 
  245. 16.2.5 拆分 
  246. 16.2.6 交换 
  247. 16.2.7 排序和搜索 
  248. 16.2.8 比较切片 
  249. 16.2.9 随机元素 
  250. 16.2.10 Rust排除无效错误 
  251. 16.3 VecDeque 
  252. 16.4 LinkedList 
  253. 16.5 BinaryHeap 
  254. 16.6 HashMap和BTreeMap 
  255. 16.6.1 条目 
  256. 16.6.2 映射迭代 
  257. 16.7 HashSet和BTreeSet 
  258. 16.7.1 集迭代 
  259. 16.7.2 相等的值不相同 
  260. 16.7.3 整集操作 
  261. 16.8 散列 
  262. 16.9 标准集合之外 
  263. 第17章 字符串与文本 
  264. 17.1 Unicode背景知识 
  265. 17.1.1 ASCII、Latin-1和Unicode 
  266. 17.1.2 UTF-8 
  267. 17.1.3 文本方向性 
  268. 17.2 字符(char) 
  269. 17.2.1 字符分类 
  270. 17.2.2 处理数字 
  271. 17.2.3 字符大小写转换 
  272. 17.2.4 与整数相互转换 
  273. 17.3 String与str 
  274. 17.3.1 创建字符串值 
  275. 17.3.2 简单检查 
  276. 17.3.3 追加和插入文本 
  277. 17.3.4 删除文本 
  278. 17.3.5 搜索与迭代的约定 
  279. 17.3.6 搜索文本的模式 
  280. 17.3.7 搜索与替换 
  281. 17.3.8 迭代文本 
  282. 17.3.9 修剪 
  283. 17.3.10 字符串大小写转换 
  284. 17.3.11 从字符串解析出其他类型 
  285. 17.3.12 将其他类型转换为字符串 
  286. 17.3.13 作为其他类文本类型借用 
  287. 17.3.14 访问UTF-8格式的文本 
  288. 17.3.15 从UTF-8数据产生文本 
  289. 17.3.16 阻止分配 
  290. 17.3.17 字符串作为泛型集合 
  291. 17.4 格式化值 
  292. 17.4.1 格式化文本值 
  293. 17.4.2 格式化数值 
  294. 17.4.3 格式化其他类型 
  295. 17.4.4 为调试格式化值 
  296. 17.4.5 为调试格式化指针 
  297. 17.4.6 通过索引或名字引用参数 
  298. 17.4.7 动态宽度与精度 
  299. 17.4.8 格式化自定义类型 
  300. 17.4.9 在你的代码中使用格式化语言 
  301. 17.5 正则表达式 
  302. 17.5.1 基本用法 
  303. 17.5.2 懒构建Regex值 
  304. 17.6 规范化 
  305. 17.6.1 规范化形式 
  306. 17.6.2 unicode-normalization包 
  307. 第18章 输入和输出 
  308. 18.1 读取器和写入器 
  309. 18.1.1 读取器 
  310. 18.1.2 缓冲读取器 
  311. 18.1.3 读取文本行 
  312. 18.1.4 收集行 
  313. 18.1.5 写入器 
  314. 18.1.6 文件 
  315. 18.1.7 搜寻 
  316. 18.1.8 其他读取器和写入器类型 
  317. 18.1.9 二进制数据、压缩与序列化 
  318. 18.2 文件与目录 
  319. 18.2.1 OsStr和Path 
  320. 18.2.2 Path和PathBuf的方法 
  321. 18.2.3 文件系统访问函数 
  322. 18.2.4 读取目录 
  323. 18.2.5 平台特定的特性
  324. 18.3 网络编程 
  325. 第19章 并发 
  326. 19.1 并行分叉–合并 
  327. 19.1.1 产生及合并 
  328. 19.1.2 跨线程错误处理 
  329. 19.1.3 跨线程共享不可修改数据 
  330. 19.1.4 Rayon 
  331. 19.1.5 重温曼德布洛特集合 
  332. 19.2 通道 
  333. 19.2.1 发送值 
  334. 19.2.2 接收值 
  335. 19.2.3 运行管道 
  336. 19.2.4 通道特性与性能 
  337. 19.2.5 线程安全:Send与Sync 
  338. 19.2.6 将所有迭代器都接到通道上 
  339. 19.2.7 超越管道 
  340. 19.3 共享可修改状态 
  341. 19.3.1 什么是互斥量 
  342. 19.3.2 Mutex 
  343. 19.3.3 mut与Mutex 
  344. 19.3.4 互斥量的问题 
  345. 19.3.5 死锁 
  346. 19.3.6 中毒的互斥量 
  347. 19.3.7 使用互斥量的多消费者通道 
  348. 19.3.8 读/写锁(RwLock) 
  349. 19.3.9 条件变量(Condvar)
  350. 19.3.10 原子类型 
  351. 19.3.11 全局变量 
  352. 19.4 习惯编写Rust并发代码 
  353. 第20章 宏 
  354. 20.1 宏基础 
  355. 20.1.1 宏扩展基础 
  356. 20.1.2 意外结果 
  357. 20.1.3 重复 
  358. 20.2 内置宏 
  359. 20.3 调试宏 
  360. 20.4 json!宏 
  361. 20.4.1 片段类型 
  362. 20.4.2 在宏里使用递归 
  363. 20.4.3 在宏里使用特型 
  364. 20.4.4 作用域与自净宏 
  365. 20.4.5 导入和导出宏 
  366. 20.5 匹配时避免语法错误 
  367. 20.6 超越macro_rules! 
  368. 第21章 不安全代码 
  369. 21.1 不安全源自哪里 
  370. 21.2 不安全的块 
  371. 21.3 不安全的函数 
  372. 21.4 不安全的块还是不安全的函数 
  373. 21.5 未定义行为 
  374. 21.6 不安全的特型 
  375. 21.7 原始指针 
  376. 21.7.1 安全解引用原始指针 
  377. 21.7.2 示例:RefWithFlag 
  378. 21.7.3 可空指针 
  379. 21.7.4 类型大小与对齐 
  380. 21.7.5 指针算术 
  381. 21.7.6 移入和移出内存 
  382. 21.7.7 示例:GapBuffer 
  383. 21.7.8 不安全代码中的诧异安全性 
  384. 21.8 外来函数:在Rust中调用C和C++ 
  385. 21.8.1 查找共有数据表示 
  386. 21.8.2 声明外来函数和变量 
  387. 21.8.3 使用库函数 
  388. 21.8.4 libgit2的原始接口 
  389. 21.8.5 libgit2的安全接口 
  390. 21.9 小结 
  391. 作者介绍 
  392. 封面介绍 
书名:Rust程序设计
译者:李松峰 译
国内出版社:人民邮电出版社
出版时间:2020年09月
页数:476
书号:978-7-115-54649-4
原版书书名:Programming Rust
原版书出版商:O'Reilly Media
Jim Blandy
 
Jim Blandy,Mozilla软件工程师,拥有近40年编程经验和30年自由软件开发经验,是Subversion版本控制系统最初的设计者之一。
 
 
Jason Orendorff
 
Jason Orendorff,资深软件工程师,拥有20余年软件开发经验,目前在为Mozilla Firefox Web浏览器开发JavaScript引擎。