书籍详情

Rust权威指南

Rust权威指南

作者:[美] 史蒂夫・克拉伯尼克,卡罗尔・尼科尔斯 著,毛靖凯 译

出版社:电子工业出版社

出版时间:2020-05-01

ISBN:9787121387067

定价:¥159.00

购买这本书可以去
内容简介
  本书由Rust核心开发团队编写而成,由浅入深地探讨了Rust语言的方方面面。从学习函数、选择数据结构及绑定变量入手,逐步介绍所有权、trait、生命周期、安全保证等高级概念,模式匹配、错误处理、包管理、函数式特性、并发机制等实用工具,以及两个完整的项目开发实战案例。 作为开源的系统级编程语言,Rust可以帮助你编写出更为快速且更为可靠的软件,在给予开发者底层控制能力的同时,通过深思熟虑的工程设计避免了传统语言带来的诸多麻烦。 本书被视为Rust开发工作的必读书目,适合所有希望评估、入门、提高和研究Rust语言的软件开发人员阅读。
作者简介
  Steve Klabnik,Rust文档团队负责人,Rust核心开发者之一,Rust布道者及高产的开源贡献者,此前致力于Ruby等项目的开发。Carol Nichols,Rust核心团队成员,i32、LLC联合构建者,Rust Belt Rust会议组织者。毛靖凯,游戏设计师,一直专注于游戏领域研发,曾负责设计和维护了多个商业游戏的基础框架。业余时间活跃于Rust开源社区,并尝试使用Rust来解决游戏领域中的诸多问题。唐刚,资深开发者,Rustcc社区创始人和维护者之一。目前就职于Cdot Network。使用Rust从事区块链共识协议的开发工作。沙渺,嵌入式开发者,国内Rust语言社区和Raspberry Pi(树莓派)开发社区早期参与者。负责维护多个RISC-V架构硬件平台的基础函数库。
目录
目 录
第1章 入门指南\t1
安装\t1
在Linux或macOS环境中安装Rust\t2
在Windows环境中安装Rust\t3
更新与卸载\t4
常见问题\t4
本地文档\t4
Hello, World!\t5
创建一个文件夹\t5
编写并运行一个Rust程序\t6
对这个程序的剖析\t7
编译与运行是两个不同的步骤\t8
Hello, Cargo!\t10
使用Cargo创建一个项目\t10
使用Cargo构建和运行项目\t13
以Release模式进行构建\t15
学会习惯Cargo\t15
总结\t16
第2章 编写一个猜数游戏\t17
创建一个新的项目\t18
处理一次猜测\t19
使用变量来存储值\t20
使用Result类型来处理可能失败的情况\t22
通过println!中的占位符输出对应的值\t24
尝试运行代码\t24
生成一个保密数字\t25
借助包来获得更多功能\t25
生成一个随机数\t28
比较猜测数字与保密数字\t31
使用循环来实现多次猜测\t35
在猜测成功时优雅地退出\t37
处理非法输入\t38
总结\t40
第3章 通用编程概念\t42
变量与可变性\t43
变量与常量之间的不同\t46
隐藏\t47
数据类型\t48
标量类型\t49
复合类型\t54
函数\t58
函数参数\t60
函数体中的语句和表达式\t61
函数的返回值\t63
注释\t66
控制流\t67
if表达式\t67
使用循环重复执行代码\t72
总结\t78
第4章 认识所有权\t79
什么是所有权\t79
所有权规则\t82
变量作用域\t82
String类型\t83
内存与分配\t84
所有权与函数\t91
返回值与作用域\t92
引用与借用\t94
可变引用\t96
悬垂引用\t99
引用的规则\t101
切片\t101
字符串切片\t104
其他类型的切片\t109
总结\t109
第5章 使用结构体来组织相关联的数据\t111
定义并实例化结构体\t112
在变量名与字段名相同时使用简化版的字段初始化方法\t114
使用结构体更新语法根据其他实例创建新实例\t114
使用不需要对字段命名的元组结构体来创建不同的类型\t115
没有任何字段的空结构体\t116
一个使用结构体的示例程序\t118
使用元组来重构代码\t119
使用结构体来重构代码:增加有意义的描述信息\t120
通过派生trait增加实用功能\t121
方法\t124
定义方法\t124
带有更多参数的方法\t127
关联函数\t128
多个impl块\t129
总结\t129
第6章 枚举与模式匹配\t130
定义枚举\t131
枚举值\t131
Option枚举及其在空值处理方面的优势\t136
控制流运算符match\t140
绑定值的模式\t142
匹配Option<T>\t143
匹配必须穷举所有的可能\t145
_通配符\t146
简单控制流if let\t146
总结\t148
第7章 使用包、单元包及模块来管理日渐复杂的项目\t150
包与单元包\t152
通过定义模块来控制作用域及私有性\t153
用于在模块树中指明条目的路径\t156
使用pub关键字来暴露路径\t159
使用super关键字开始构造相对路径\t161
将结构体或枚举声明为公共的\t162
用use关键字将路径导入作用域\t165
创建use路径时的惯用模式\t166
使用as关键字来提供新的名称\t168
使用pub use重导出名称\t169
使用外部包\t170
使用嵌套的路径来清理众多use语句\t171
通配符\t172
将模块拆分为不同的文件\t172
总结\t174
第8章 通用集合类型\t175
使用动态数组存储多个值\t176
创建动态数组\t176
更新动态数组\t177
销毁动态数组时也会销毁其中的元素\t177
读取动态数组中的元素\t178
遍历动态数组中的值\t181
使用枚举来存储多个类型的值\t181
使用字符串存储UTF-8编码的文本\t183
字符串是什么\t183
创建一个新的字符串\t184
更新字符串\t185
字符串索引\t188
字符串切片\t191
遍历字符串的方法\t192
字符串的确没那么简单\t193
在哈希映射中存储键值对\t193
创建一个新的哈希映射\t194
哈希映射与所有权\t195
访问哈希映射中的值\t196
更新哈希映射\t197
哈希函数\t199
总结\t200
第9章 错误处理\t201
不可恢复错误与panic!\t202
使用panic!产生的回溯信息\t203
可恢复错误与Result\t207
匹配不同的错误\t210
失败时触发panic的快捷方式:unwrap和expect\t212
传播错误\t213
要不要使用panic!\t219
示例、原型和测试\t220
当你比编译器拥有更多信息时\t220
错误处理的指导原则\t221
创建自定义类型来进行有效性验证\t222
总结\t225
第10章 泛型、trait与生命周期\t226
通过将代码提取为函数来减少重复工作\t227
泛型数据类型\t230
在函数定义中\t230
在结构体定义中\t234
在枚举定义中\t236
在方法定义中\t237
泛型代码的性能问题\t239
trait:定义共享行为\t241
定义trait\t241
为类型实现trait\t242
默认实现\t245
使用trait作为参数\t247
返回实现了trait的类型\t249
使用trait约束来修复largest函数\t251
使用trait约束来有条件地实现方法\t254
使用生命周期保证引用的有效性\t256
使用生命周期来避免悬垂引用\t256
借用检查器\t257
函数中的泛型生命周期\t259
生命周期标注语法\t260
函数签名中的生命周期标注\t261
深入理解生命周期\t264
结构体定义中的生命周期标注\t266
生命周期省略\t267
方法定义中的生命周期标注\t270
静态生命周期\t271
同时使用泛型参数、trait约束与生命周期\t272
总结\t273
第11章 编写自动化测试\t274
如何编写测试\t275
测试函数的构成\t275
使用assert!宏检查结果\t280
使用assert_eq!宏和assert_ne!宏判断相等性\t284
添加自定义的错误提示信息\t287
使用should_panic检查panic\t289
使用Result<T, E>编写测试\t294
控制测试的运行方式\t295
并行或串行地进行测试\t296
显示函数输出\t296
只运行部分特定名称的测试\t299
通过显式指定来忽略某些测试\t301
测试的组织结构\t303
单元测试\t303
集成测试\t305
总结\t311
第12章 I/O项目:编写一个命令行程序\t312
接收命令行参数\t313
读取参数值\t314
将参数值存入变量\t316
读取文件\t317
重构代码以增强模块化程度和错误处理能力\t319
二进制项目的关注点分离\t320
修复错误处理逻辑\t325
从main中分离逻辑\t330
将代码分离为独立的代码包\t333
使用测试驱动开发来编写库功能\t335
编写一个会失败的测试\t336
编写可以通过测试的代码\t339
处理环境变量\t343
为不区分大小写的search函数编写一个会失败的测试\t343
实现search_case_insensitive函数\t345
将错误提示信息打印到标准错误而不是标准输出\t349
确认错误被写到了哪里\t350
将错误提示信息打印到标准错误\t351
总结\t352
第13章 函数式语言特性:迭代器与闭包\t353
闭包:能够捕获环境的匿名函数\t354
使用闭包来创建抽象化的程序行为\t354
闭包的类型推断和类型标注\t361
使用泛型参数和Fn trait来存储闭包\t363
Cacher实现的局限性\t367
使用闭包捕获上下文环境\t368
使用迭代器处理元素序列\t371
Iterator trait和next方法\t373
消耗迭代器的方法\t374
生成其他迭代器的方法\t375
使用闭包捕获环境\t376
使用Iterator trait来创建自定义迭代器\t378
改进I/O项目\t381
使用迭代器代替clone\t381
使用迭代器适配器让代码更加清晰\t385
比较循环和迭代器的性能\t386
总结\t388
第14章 进一步认识Cargo及crates.io\t390
使用发布配置来定制构建\t391
将包发布到crates.io上\t392
编写有用的文档注释\t393
使用pub use来导出合适的公共API\t397
创建crates.io账户\t401
为包添加元数据\t401
发布到crates.io\t403
发布已有包的新版本\t404
使用cargo yank命令从cargo.io上移除版本\t404
Cargo工作空间\t405
创建工作空间\t405
在工作空间中创建第二个包\t407
使用cargo install从crates.io上安装可执行程序\t413
使用自定义命令扩展Cargo的功能\t414
总结\t414
第15章 智能指针\t415
使用Box<T>在堆上分配数据\t417
使用Box<T>在堆上存储数据\t417
使用装箱定义递归类型\t418
通过Deref trait将智能指针视作常规引用\t423
使用解引用运算符跳转到指针指向的值\t424
把Box<T>当成引用来操作\t425
定义我们自己的智能指针\t426
通过实现Deref trait来将类型视作引用\t427
函数和方法的隐式解引用转换\t428
解引用转换与可变性\t430
借助Drop trait在清理时运行代码\t431
使用std::mem::drop提前丢弃值\t433
基于引用计数的智能指针Rc<T>\t435
使用Rc<T>共享数据\t436
克隆Rc<T>会增加引用计数\t439
RefCell<T>和内部可变性模式\t440
使用RefCell<T>在运行时检查借用规则\t441
内部可变性:可变地借用一个不可变的值\t442
将Rc<T>和RefCell<T>结合使用来实现一个拥有多重所有权的可变数据\t450
循环引用会造成内存泄漏\t452
创建循环引用\t453
使用Weak<T>代替Rc<T>来避免循环引用\t456
总结\t463
第16章 无畏并发\t464
使用线程同时运行代码\t466
使用spawn创建新线程\t467
使用join句柄等待所有线程结束\t469
在线程中使用move闭包\t471
使用消息传递在线程间转移数据\t475
通道和所有权转移\t478
发送多个值并观察接收者的等待过程\t480
通过克隆发送者创建多个生产者\t481
共享状态的并发\t483
互斥体一次只允许一个线程访问数据\t484
RefCell<T>/Rc<T>和Mutex<T>/Arc<T>之间的相似性\t493
使用Sync trait和Send trait对并发进行扩展\t494
允许线程间转移所有权的Send trait\t494
允许多线程同时访问的Sync trait\t495
手动实现Send和Sync是不安全的\t495
总结\t495
第17章 Rust的面向对象编程特性\t497
面向对象语言的特性\t497
对象包含数据和行为\t498
封装实现细节\t498
作为类型系统和代码共享机制的继承\t500
使用trait对象来存储不同类型的值\t502
为共有行为定义一个trait\t503
实现trait\t505
trait对象会执行动态派发\t509
trait对象必须保证对象安全\t510
实现一种面向对象的设计模式\t511
定义Post并新建一个处于草稿状态下的新实例\t513
存储文章内容的文本\t514
确保草稿的可读内容为空\t515
请求审批文章并改变其状态\t516
添加approve方法来改变content的行为\t518
状态模式的权衡取舍\t521
总结\t527
第18章 模式匹配\t529
所有可以使用模式的场合\t530
match分支\t530
if let条件表达式\t531
while let条件循环\t533
for循环\t533
let语句\t534
函数的参数\t536
可失败性:模式是否会匹配失败\t537
模式语法\t539
匹配字面量\t539
匹配命名变量\t540
多重模式\t541
使用...来匹配值区间\t542
使用解构来分解值\t543
忽略模式中的值\t548
使用匹配守卫添加额外条件\t554
@绑定\t556
总结\t557
第19章 高级特性\t559
不安全Rust\t560
不安全超能力\t561
解引用裸指针\t562
调用不安全函数或方法\t564
访问或修改一个可变静态变量\t570
实现不安全trait\t572
使用不安全代码的时机\t573
高级trait\t573
在trait的定义中使用关联类型指定占位类型\t573
默认泛型参数和运算符重载\t575
用于消除歧义的完全限定语法:调用相同名称的方法\t578
用于在trait中附带另外一个trait功能的超trait\t582
使用newtype模式在外部类型上实现外部trait\t585
高级类型\t586
使用newtype模式实现类型安全与抽象\t587
使用类型别名创建同义类型\t587
永不返回的Never类型\t590
动态大小类型和Sized trait\t593
高级函数与闭包\t595
函数指针\t595
返回闭包\t598
宏\t599
宏与函数之间的差别\t599
用于通用元编程的macro_rules!声明宏\t600
基于属性创建代码的过程宏\t603
如何编写一个自定义derive宏\t604
属性宏\t611
函数宏\t611
总结\t612
第20章 最后的项目:构建多线程Web服务器\t613
构建单线程Web服务器\t614
监听TCP连接\t615
读取请求\t617
仔细观察HTTP请求\t620
编写响应\t621
返回真正的HTML\t622
验证请求有效性并选择性地响应\t624
少许重构\t626
把单线程服务器修改为多线程服务器\t628
在现有的服务器实现中模拟一个慢请求\t628
使用线程池改进吞吐量\t629
优雅地停机与清理\t652
为ThreadPool实现Drop trait\t652
通知线程停止监听任务\t655
总结\t661
附录A 关键字\t662
当前正在使用的关键字\t662
将来可能会使用的保留关键字\t664
原始标识符\t665
附录B 运算符和符号\t667
运算符\t667
非运算符符号\t669
附录C 可派生trait\t673
面向程序员格式化输出的Debug\t674
用于相等性比较的PartialEq和Eq\t675
使用PartialOrd和Ord进行次序比较\t675
使用Clone和Copy复制值\t676
用于将值映射到另外一个长度固定的值的Hash\t677
用于提供默认值的Default\t678
附录D 有用的开发工具\t679
使用rustfmt自动格式化代码\t679
使用rustfix修复代码\t680
使用Clippy完成更多的代码分析\t681
使用Rust语言服务器来集成IDE\t683
附录E 版本\t684
猜您喜欢

读书导航