技术教育社区
www.teccses.org

RUST权威指南(第2版)

封面

作者:(美)SteveKlabnik(史蒂夫·克拉伯尼克),CarolNichols(卡罗尔·尼科尔斯) 著 毛靖凯 译

页数:704

出版社:电子工业出版社

出版日期:2025

ISBN:9787121494734

电子书格式:pdf/epub/txt

网盘下载地址:下载RUST权威指南(第2版)

内容简介

本书由Rust核心开发团队编写而成,由浅入深地探讨了Rust语言的方方面面。从学习函数、选择数据结构及绑定变量入手,逐步介绍所有权、trait、生命周期、安全保证等高级概念,模式匹配、错误处理、包管理、函数式特性、并发机制等实用工具,以及两个完整的项目开发实战案例。 作为开源的系统级编程语言,Rust可以帮助你编写出更为快速且更为可靠的软件,在给予开发者底层控制能力的同时,通过深思熟虑的工程设计避免了传统语言带来的诸多麻烦。

作者简介

Steve?Klabnik曾是Rust的核心开发者及Rust文档团队的负责人。他时常参与各种演讲,并且是一位十分多产的开源贡献者。Carol?Nichols曾是Rust核心团队中的成员,目前是Rust Crates.io团队成员,也是Integer?32公司(全球首家专注于Rust的软件咨询公司)的联合创始人,以及Rust Belt Rust(Rust铁锈地带)会议的组织者。
游戏设计师,一直专注于游戏领域研发,曾负责设计和维护了多个商业游戏的基础框架。业余时间活跃于Rust开源社区,并尝试使用Rust来解决游戏领域中的诸多问题。

目录

1 入门指南 1

安装 1

在Linux或macOS环境中安装Rust 2

在Windows环境中安装Rust 3

常见问题 3

更新与卸载 4

本地文档 5

Hello, world! 5

创建一个文件夹 5

编写并运行一个Rust程序 6

Rust程序剖析 7

编译与运行是两个不同的步骤 8

Hello, Cargo! 10

使用Cargo创建一个项目 10

使用Cargo构建和运行项目 13

以Release模式进行构建 15

学会习惯Cargo 15

总结 16

2 编写一个猜数游戏 17

创建一个新的项目 17

处理一次猜测 19

使用变量存储值 20

获得用户的输入 21

使用Result类型处理可能失败的情况 22

通过println!中的占位符输出对应的值 23

测试第一部分 24

生成一个保密数字 24

借助包获得更多功能 25

生成一个随机数 28

比较猜测数字与保密数字 31

使用循环实现多次猜测 35

在猜测成功时优雅地退出 37

处理非法输入 37

总结 40

3 通用编程概念 41

变量与可变性 42

常量 44

隐藏 45

数据类型 47

标量类型 48

复合类型 53

函数 57

参数 59

语句和表达式 60

函数的返回值 62

注释 65

控制流 66

if表达式 66

使用循环重复执行代码 70

总结 77

4 认识所有权 78

什么是所有权 78

所有权规则 81

变量作用域 81

String类型 82

内存与分配 83

所有权与函数 90

返回值与作用域 91

引用与借用 93

可变引用 95

悬垂引用 99

引用的规则 101

切片类型 101

字符串切片 103

其他类型的切片 108

总结 109

5 使用结构体组织相关联的数据 110

定义并实例化结构体 110

使用简化版的字段初始化方法 113

使用结构体更新语法,基于其他实例来创建新实例 113

使用不需要对字段命名的元组结构体来创建不同的类型 115

没有任何字段的单元结构体 116

一个使用结构体的示例程序 118

使用元组重构代码 119

使用结构体重构代码:增加有意义的描述信息 120

通过派生trait增加实用功能 121

方法 125

定义方法 125

带有更多参数的方法 129

关联函数 130

多个impl块 131

总结 132

6 枚举与模式匹配 133

定义枚举 133

枚举值 134

Option枚举及其在空值处理方面的优势 139

控制流结构match 143

绑定值的模式 145

匹配Option<T> 146

匹配必须穷举所有的可能性 148

通配模式及_占位符 149

简单控制流if let 151

总结 153

7 使用包、单元包和模块管理日渐复杂的项目 154

包与单元包 155

通过定义模块来控制作用域及私有性 160

用于在模块树中指明条目的路径 162

使用pub关键字来暴露路径 165

从super关键字开始构造相对路径 169

将结构体或枚举声明为公共的 170

使用use关键字将路径导入作用域 172

创建use路径时的惯用方式 174

使用as关键字来提供新的名称 175

使用pub use重导出名称 176

使用外部包 177

使用嵌套路径来清理众多的use语句 178

通配符 179

将模块拆分为不同的文件 180

总结 182

8 通用集合类型 184

使用动态数组存储多个值 185

创建动态数组 185

更新动态数组 186

读取动态数组中的元素 186

遍历动态数组中的值 189

使用枚举存储多个类型的值 190

在销毁动态数组时也会销毁其中的元素 191

使用字符串存储UTF-8编码的文本 192

字符串是什么 192

创建一个新的字符串 193

更新字符串 194

索引字符串 197

字符串切片 200

遍历字符串的方法 201

字符串的确没那么简单 202

在哈希映射中存储键值对 202

创建一个新的哈希映射 203

访问哈希映射中的值 203

哈希映射与所有权 205

更新哈希映射 205

哈希函数 208

总结 208

9 错误处理 210

不可恢复错误与panic! 211

可恢复错误与Result 215

匹配不同的错误 217

传播错误 221

要不要使用panic! 229

示例、原型代码和测试 229

当你比编译器拥有更多信息时 230

错误处理指导原则 230

创建自定义类型进行有效性验证 232

总结 235

10 泛型、trait与生命周期 236

通过将代码提取为函数来减少重复工作 237

泛型数据类型 240

在函数定义中 240

在结构体定义中 243

在枚举定义中 245

在方法定义中 246

泛型代码的性能问题 249

trait:定义共享行为 250

定义trait 250

为类型实现trait 251

默认实现 254

使用trait作为参数 256

返回实现了trait的类型 259

使用trait约束有条件地实现方法 260

使用生命周期保证引用的有效性 262

使用生命周期来避免悬垂引用 262

借用检查器 264

函数中的泛型生命周期 265

生命周期标注语法 267

函数签名中的生命周期标注 267

深入理解生命周期 271

结构体定义中的生命周期标注 272

生命周期省略 273

方法定义中的生命周期标注 276

静态生命周期 277

同时使用泛型参数、trait约束与生命周期 278

总结 279

11 编写自动化测试 280

如何编写测试 281

测试函数的构成 281

使用assert!宏检查结果 286

使用assert_eq!和assert_ne!宏判断相等性 290

添加自定义的错误提示信息 293

使用should_panic检查panic 295

使用Result<T, E>编写测试 300

控制测试的运行方式 301

并行或串行地运行测试 301

显示函数输出 302

运行部分特定名称的测试 304

通过显式指定来忽略某些测试 307

测试的组织结构 308

单元测试 309

集成测试 311

总结 316

12 I/O项目:编写一个命令行程序 317

接收命令行参数 318

读取参数值 319

将参数值存入变量中 321

读取文件 322

重构代码以增强模块化程度和错误处理能力 324

二进制项目的关注点分离 325

修正错误处理逻辑 330

从main中分离逻辑 334

将代码分离为独立的代码包 337

使用测试驱动开发编写库功能 339

编写一个会失败的测试 340

编写可以通过测试的代码 343

处理环境变量 347

为不区分大小写的search函数编写一个会失败的测试 347

实现search_case_insensitive函数 349

将错误提示信息打印到标准错误流而不是标准输出流 354

确认错误被写到了哪里 354

将错误提示信息打印到标准错误流 355

总结 356

13 函数式语言特性:迭代器与闭包 357

闭包:能够捕获环境的匿名函数 358

使用闭包捕获环境 358

闭包的类型推断和类型标注 361

捕获引用或移动所有权 363

将捕获的值移出闭包及Fn系列trait 366

使用迭代器处理元素序列 371

Iterator trait和next方法 372

消耗迭代器的方法 373

生成其他迭代器的方法 374

使用闭包捕获环境 376

改进I/O项目 378

使用迭代器代替clone 378

使用迭代器适配器让代码更加清晰 382

在循环与迭代器之间做出选择 383

比较循环和迭代器的性能 383

总结 386

14 进一步认识Cargo及crates.io 387

使用发布配置定制构建 388

将包发布到crates.io平台 389

编写有用的文档注释 390

使用pub use导出合适的公共API 393

创建crates.io账户 398

为包添加元数据 398

发布到crates.io 400

发布已有包的新版本 401

使用cargo yank命令从crates.io上撤回版本 401

Cargo工作空间 402

创建工作空间 402

在工作空间中创建第二个包 404

使用cargo install安装二进制文件 409

使用自定义命令扩展Cargo的功能 410

总结 411

15 智能指针 412

使用Box<T>在堆上分配数据 414

使用Box<T>在堆上存储数据 414

使用装箱定义递归类型 415

通过Deref trait将智能指针视作常规引用 421

跳转到指针指向的值 421

把Box<T>当成引用来操作 422

定义我们自己的智能指针 423

实现Deref trait 424

函数和方法的隐式解引用转换 426

解引用转换与可变性 427

借助Drop trait在清理时运行代码 428

基于引用计数的智能指针Rc<T> 433

使用Rc<T>共享数据 433

克隆Rc<T>会增加引用计数 436

RefCell<T>和内部可变性模式 438

使用RefCell<T>在运行时检查借用规则 438

内部可变性:可变地借用一个不可变的值 440

结合使用Rc<T>和RefCell<T>来实现拥有多重所有权的可变数据 448

循环引用会造成内存泄漏 450

创建循环引用 450

使用Weak<T>代替Rc<T>来避免循环引用 454

总结 460

16 无畏并发 461

使用线程同时运行代码 462

使用spawn创建新线程 463

使用join句柄等待所有线程结束 465

在线程中使用move闭包 467

使用消息传递在线程间转移数据 471

通道和所有权转移 474

发送多个值并观察接收者的等待过程 476

通过克隆发送者创建多个生产者 477

共享状态的并发 479

互斥体一次只允许一个线程访问数据 479

RefCell<T>/Rc<T>和Mutex<T>/Arc<T>之间的相似性 486

使用Send trait和Sync trait对并发进行扩展 487

允许线程间转移所有权的Send trait 487

允许多个线程同时访问的Sync trait 488

手动实现Send和Sync是不安全的 488

总结 489

17 Rust的面向对象编程特性 490

面向对象语言的特性 490

对象包含数据和行为 491

封装实现细节 491

作为类型系统和代码共享机制的继承 493

使用trait对象存储不同类型的值 495

为共有行为定义一个trait 496

实现trait 498

trait对象会执行动态

赞助用户下载地址

立即下载

(解压密码:www.teccses.org)

Article Title:《RUST权威指南(第2版)》
Article link:https://www.teccses.org/41953.html