作者:
Steve Klabnik
/
Carol Nichols
出版社: 电子工业出版社
译者: 毛靖凯
出版年: 2025-2
页数: 704
定价: 168.00
ISBN: 9787121494734
出版社: 电子工业出版社
译者: 毛靖凯
出版年: 2025-2
页数: 704
定价: 168.00
ISBN: 9787121494734
豆瓣评分
内容简介 · · · · · ·
《Rust权威指南(第2版)》由Rust核心团队成员编写,由浅入深地探讨了Rust语言的方方面面。从创建函数、选择数据类型及绑定变量等基础内容着手,逐步介绍所有权、生命周期、trait、安全保证等高级概念,错误处理、模式匹配、包管理、并发机制、函数式特性等实用工具,以及完整的项目开发实战案例。
作为开源的系统级编程语言,Rust可以帮助你编写更有效率且更加可靠的软件,在给予开发者底层控制能力的同时,通过高水准的工程设计避免了传统语言带来的诸多麻烦。
《Rust权威指南(第2版)》适合所有希望评估、入门、提高和研究Rust语言的软件开发人员阅读。
作者简介 · · · · · ·
Steve Klabnik曾是Rust的核心开发者及Rust文档团队的负责人。他时常参与各种演讲,并且是一位十分多产的开源贡献者。
Carol Nichols曾是Rust核心团队中的成员,目前是Rust Crates.io团队成员,也是Integer 32公司(全球首家专注于Rust的软件咨询公司)的联合创始人,以及Rust Belt 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对象会执行动态派发 502
实现一种面向对象的设计模式 502
定义Post并创建一个处于草稿状态的新实例 505
存储文章内容的文本 506
确保草稿的可读内容为空 507
请求审批文章并改变其状态 507
添加approve方法来改变content的行为 509
状态模式的权衡取舍 513
总结 518
18 模式与匹配 520
所有可以使用模式的场合 521
match分支 521
if let条件表达式 522
while let条件循环 524
for循环 524
let语句 525
函数的参数 527
可失败性:模式是否会匹配失败 528
模式语法 531
匹配字面量 531
匹配命名变量 531
多重模式 533
使用“..=”匹配区间值 533
通过解构分解值 534
忽略模式中的值 540
使用匹配守卫添加额外条件 545
@绑定 548
总结 549
19 高级特性 550
不安全RUST 551
不安全超能力 551
解引用裸指针 553
调用不安全的函数或方法 555
访问或修改可变静态变量 561
实现不安全trait 563
访问联合体中的字段 564
使用不安全代码的时机 564
高级TRAIT 564
关联类型 565
默认泛型参数和运算符重载 566
消除同名方法在调用时的歧义 569
使用超trait 574
使用newtype模式在外部类型上实现外部trait 576
高级类型 578
使用newtype模式实现类型安全与抽象 578
使用类型别名创建同义类型 579
永不返回的never类型 582
动态大小类型和Sized trait 584
高级函数与闭包 586
函数指针 586
返回闭包 589
宏 590
宏与函数之间的区别 591
用于通用元编程的macro_rules!声明宏 591
基于属性创建代码的过程宏 594
如何编写一个自定义派生宏 595
属性宏 601
函数宏 602
总结 603
20 最后的项目:构建多线程WEB服务器 604
构建单线程WEB服务器 605
监听TCP连接 606
读取请求 608
仔细观察HTTP请求 611
编写响应 612
返回真正的HTML文件 613
验证请求的合法性并有选择地响应 615
少许重构 618
把单线程服务器修改为多线程服务器 619
模拟一个慢请求 620
使用线程池改进吞吐量 621
优雅地停机与清理 642
为ThreadPool实现Drop trait 642
通知线程停止监听任务 645
总结 650
附录A 关键字 651
附录B 运算符和符号 656
附录C 可派生 TRAIT 663
附录D 有用的开发工具 669
附录E 阶段性版本 673
· · · · · · (收起)
安装 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对象会执行动态派发 502
实现一种面向对象的设计模式 502
定义Post并创建一个处于草稿状态的新实例 505
存储文章内容的文本 506
确保草稿的可读内容为空 507
请求审批文章并改变其状态 507
添加approve方法来改变content的行为 509
状态模式的权衡取舍 513
总结 518
18 模式与匹配 520
所有可以使用模式的场合 521
match分支 521
if let条件表达式 522
while let条件循环 524
for循环 524
let语句 525
函数的参数 527
可失败性:模式是否会匹配失败 528
模式语法 531
匹配字面量 531
匹配命名变量 531
多重模式 533
使用“..=”匹配区间值 533
通过解构分解值 534
忽略模式中的值 540
使用匹配守卫添加额外条件 545
@绑定 548
总结 549
19 高级特性 550
不安全RUST 551
不安全超能力 551
解引用裸指针 553
调用不安全的函数或方法 555
访问或修改可变静态变量 561
实现不安全trait 563
访问联合体中的字段 564
使用不安全代码的时机 564
高级TRAIT 564
关联类型 565
默认泛型参数和运算符重载 566
消除同名方法在调用时的歧义 569
使用超trait 574
使用newtype模式在外部类型上实现外部trait 576
高级类型 578
使用newtype模式实现类型安全与抽象 578
使用类型别名创建同义类型 579
永不返回的never类型 582
动态大小类型和Sized trait 584
高级函数与闭包 586
函数指针 586
返回闭包 589
宏 590
宏与函数之间的区别 591
用于通用元编程的macro_rules!声明宏 591
基于属性创建代码的过程宏 594
如何编写一个自定义派生宏 595
属性宏 601
函数宏 602
总结 603
20 最后的项目:构建多线程WEB服务器 604
构建单线程WEB服务器 605
监听TCP连接 606
读取请求 608
仔细观察HTTP请求 611
编写响应 612
返回真正的HTML文件 613
验证请求的合法性并有选择地响应 615
少许重构 618
把单线程服务器修改为多线程服务器 619
模拟一个慢请求 620
使用线程池改进吞吐量 621
优雅地停机与清理 642
为ThreadPool实现Drop trait 642
通知线程停止监听任务 645
总结 650
附录A 关键字 651
附录B 运算符和符号 656
附录C 可派生 TRAIT 663
附录D 有用的开发工具 669
附录E 阶段性版本 673
· · · · · · (收起)
原文摘录 · · · · · · ( 全部 )
-
定义元组结构体时依然使用struct:关键字开头,并由结构体名称及元组中的类型定义组成。下面的代码中展示了两个分别叫作Color和Point的元组结构体定义:struct Color(i32,i32,i32); struct Point(i32,i32,i32); let black Color(0,0,0); let origin Point(0,0,0); (查看原文) —— 引自章节:第5章 使用结构体来组织相关联的数据 111 -
隐藏 在第2章的“比较猜测数字与保密数字”一节中,我们曾经看到一个新声明的变量可以覆盖掉旧的同名变量。在Rust世界中,我们把这一现象描述为:第一个变量被等二个变量隐藏(shadow)了。 (查看原文) —— 引自章节:隐藏 47
> 全部原文摘录
Rust权威指南(第2版)的书评 · · · · · · ( 全部 4 条 )
总体好评,但略虎头蛇尾,书名瞎翻译
四天读完了这么厚一本书,不过厚度主要来自于奢侈的行间距和非常详细的分步代码,对于有编程基础的人读起来很快,没有基础的小白应该也不会拿 Rust 和此书入门。总的来说给我感觉不错。可能是前半部分给我感觉太好了,后面难度陡然上升,解释却惜字如金,留了很多无从求解的“...
(展开)
编程语言所有权概念的突破
本人C++老手,几天之内翻完这本厚厚的书,感触很多,简单写几笔。 1. Rust语言概念整体有点难,有一些概念比较新,需要好好理解,建议就算是C++和Java老手,1-6章也好好读一下,尤其是第四章所有权概念,仔细读别贪快。 2. 整个语言很现代化,和互联网紧密结合,考虑到工程、构...
(展开)
> 更多书评 4篇
论坛 · · · · · ·
在这本书的论坛里发言这本书的其他版本 · · · · · · ( 全部5 )
-
电子工业出版社 (2020)8.8分 218人读过
-
No Starch Press (2018)8.8分 153人读过
-
No Starch Press (2019)8.6分 84人读过
-
No Starch Press (2022)暂无评分 14人读过
以下书单推荐 · · · · · · ( 全部 )
谁读这本书? · · · · · ·
二手市场
· · · · · ·
- 在豆瓣转让 有15人想读,手里有一本闲着?
订阅关于Rust权威指南(第2版)的评论:
feed: rss 2.0
0 有用 dc 2025-06-30 20:06:04 重庆
比rust programming好读;排版比web版的好,适合remarkable等设备
0 有用 冥子不是名字 2025-09-18 14:36:04 湖北
电脑上直接可以通过rustup doc直接看到英文电子版