- ISBN:9787121494734
- 装帧:平塑
- 册数:暂无
- 重量:暂无
- 开本:其他
- 页数:704
- 出版时间:2025-02-01
- 条形码:9787121494734 ; 978-7-121-49473-4
内容简介
本书由Rust核心开发团队编写而成,由浅入深地探讨了Rust语言的方方面面。从学习函数、选择数据结构及绑定变量入手,逐步介绍所有权、trait、生命周期、安全保证等高级概念,模式匹配、错误处理、包管理、函数式特性、并发机制等实用工具,以及两个完整的项目开发实战案例。 作为开源的系统级编程语言,Rust可以帮助你编写出更为快速且更为可靠的软件,在给予开发者底层控制能力的同时,通过深思熟虑的工程设计避免了传统语言带来的诸多麻烦。
目录
安装 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对象会执行动态
作者简介
Steve?Klabnik曾是Rust的核心开发者及Rust文档团队的负责人。他时常参与各种演讲,并且是一位十分多产的开源贡献者。Carol?Nichols曾是Rust核心团队中的成员,目前是Rust Crates.io团队成员,也是Integer?32公司(全球首家专注于Rust的软件咨询公司)的联合创始人,以及Rust Belt Rust(Rust铁锈地带)会议的组织者。
游戏设计师,一直专注于游戏领域研发,曾负责设计和维护了多个商业游戏的基础框架。业余时间活跃于Rust开源社区,并尝试使用Rust来解决游戏领域中的诸多问题。
-
硅谷之火-人与计算机的未来
¥13.7¥39.8 -
造神:人工智能神话的起源和破除 (精装)
¥32.7¥88.0 -
软件定义网络(SDN)技术与应用
¥26.9¥39.8 -
数学之美
¥41.0¥69.0 -
谁说菜鸟不会数据分析(入门篇)(第4版)
¥43.8¥69.0 -
自己动手写PYTHON虚拟机
¥31.0¥79.0 -
Photoshop平面设计实用教程
¥14.5¥39.8 -
计算机网络技术
¥24.1¥33.0 -
Excel函数.公式与图表
¥16.4¥48.0 -
.NET安全攻防指南(下册)
¥89.0¥129.0 -
RUST权威指南(第2版)
¥114.2¥168.0 -
.NET安全攻防指南(上册)
¥89.0¥129.0 -
大模型实战:微调、优化与私有化部署
¥63.4¥99.0 -
人工智能的底层逻辑
¥55.3¥79.0 -
多模态数据融合与挖掘技术
¥34.7¥45.0 -
仓颉编程快速上手
¥62.9¥89.8 -
剪映AI
¥62.6¥88.0 -
FINAL CUT短视频剪辑零基础一本通
¥28.9¥39.8 -
FLASK 2+VUE.JS 3实战派――PYTHON WEB开发与运维
¥83.8¥118.0 -
数据挖掘技术与应用
¥46.0¥75.0