书籍详情
Rust实战:从入门到精通
作者:[意] 卡洛·米拉内西(Carlo Milanesi) 著,卢涛 李颖 译
出版社:机械工业出版社
出版时间:2021-07-01
ISBN:9787111683674
定价:¥99.00
购买这本书可以去
内容简介
本书可帮助读者学会在Unix、Linux shell、MacOS和Windows命令行上以轻松、循序渐进的方式使用Rust进行编程,引导读者全面了解Rust提供的功能。本书从Rust的基础开始讲解,包括如何命名对象、控制执行流和处理基本类型。你将了解如何进行算术运算、分配内存、使用迭代器以及处理输入/输出。掌握了这些核心技能后,你将很快就能用Rust处理错误并使用Rust的面向对象特性构建强大的Rust应用程序。本书对初学者非常友好,只需了解基本的编程知识——好是有C或C 的基础知识,就可以完成本书的学习。而且,要充分理解本书,只需知道什么是整数和浮点数,以及能够区分标识符和字符串就可以了。通过阅读本书,你将能够:● 开始使用Rust进行编程● 了解各种数据结构和数据序列● 定义函数、泛型函数和结构等● 处理闭包、可变字符串、范围和切片● 使用trait并了解生命周期
作者简介
卡洛-米拉内西(Carlo Milanesi)Rust专家和专业软件开发人员。他是Rust开发社区的贡献者,也曾使用PHP、JavaScript、Java、Ionic和Vaadin框架基于Linux的Web应用程序开发。他还涉猎了其他技术,包括GUI设计、2D和3D渲染、测试自动化、数据库访问等。他毕业于米兰大学,曾在金融和计算机辅助制造行业工作。
目录
第1章 终端打印1
1.1 如何开始1
1.2 Hello,world!2
1.3 打印字面量字符串的组合3
1.4 打印多行文本4
1.5 打印整数5
1.6 命令行脚本6
1.7 注释6
第2章 算术运算8
2.1 整数加法8
2.2 整数之间的其他运算9
2.3 浮点运算10
2.4 语句序列11
2.5 分断字面量字符串12
第3章 命名对象14
3.1 将名称与值相关联14
3.2 可变变量16
3.3 未变化的可变变量17
3.4 未初始化的变量18
3.5 前导下划线19
3.6 布尔值20
3.7 布尔表达式22
3.8 赋值中的类型一致性23
3.9 类型和可变性的改变24
3.10 赋值算术运算符25
3.11 使用标准库的函数25
第4章 控制执行流27
4.1 条件语句(if)27
4.2 条件表达式29
4.3 条件循环(while)30
4.4 无限循环(loop)32
4.5 计数循环(for)33
4.6 变量作用域34
第5章 使用数据序列37
5.1 数组37
5.1.1 可变数组39
5.1.2 指定大小的数组40
5.1.3 多维数组41
5.2 向量42
5.3 空数组和空向量45
5.4 调试打印46
5.5 复制数组和向量47
第6章 使用基本类型48
6.1 非十进制数字基数48
6.2 数字字面量中的下划线50
6.3 指数表示法50
6.4 各种有符号整数51
6.5 无符号整数类型53
6.6 目标相关的整数类型54
6.7 类型推断55
6.8 浮点数值类型57
6.9 显式转换58
6.10 数字字面量的类型后缀59
6.11 所有数值类型60
6.12 布尔值和字符61
6.13 空元组62
6.14 数组和向量类型63
6.15 常数64
6.16 发现表达式的类型64
第7章 枚举情况66
7.1 枚举66
7.2 match构造68
7.3 关系运算符和枚举69
7.4 处理所有情况70
7.4.1 对数字使用match71
7.4.2 数据枚举72
7.4.3 “match”表达式74
7.4.4 在match结构中使用守卫75
第8章 使用异构数据结构76
8.1 元组76
8.2 结构77
8.3 元组结构80
8.4 词法约定80
第9章 定义函数82
9.1 定义和调用函数82
9.1.1 使用后定义的函数83
9.1.2 函数屏蔽其他函数83
9.1.3 将参数传递给函数85
9.1.4 按值传递参数86
9.2 从函数返回值86
9.2.1 提前退出87
9.2.2 返回多个值89
9.3 如何更改属于调用者的变量90
9.4 通过引用传递参数91
9.4.1 使用引用92
9.4.2 引用的可变性93
第10章 定义泛型函数和结构95
10.1 对泛型函数的需求95
10.2 定义和使用泛型函数96
10.3 推断参数类型97
10.4 定义和使用泛型结构98
10.4.1 泛型机制99
10.4.2 泛型数组和向量101
10.4.3 泛型枚举101
10.5 错误处理103
10.6 枚举标准实用程序函数104
第11章 分配内存106
11.1 各种分配106
11.1.1 线性寻址107
11.1.2 静态分配108
11.1.3 栈分配109
11.1.4 堆分配114
11.2 与C和C 的相似性117
11.3 装箱与拆箱117
11.4 寄存器分配119
第12章 数据实现120
12.1 探索对象的大小120
12.1.1 use指令121
12.1.2 基本类型的大小122
12.2 基本类型的表示122
12.3 字节在内存中的位置123
12.4 复合数据类型的大小125
12.5 向量分配125
第13章 定义闭包128
13.1 对“一次性”函数的需求128
13.2 捕获环境129
13.3 闭包130
13.4 其他例子132
第14章 使用可变字符串134
14.1 静态字符串134
14.2 动态字符串136
14.3 字符串的实现137
14.4 创建字符串139
14.5 连接字符串140
第15章 范围和切片142
15.1 范围142
15.2 将序列传递给函数144
15.3 切片145
15.4 切片操作147
15.5 超出范围的切片149
15.6 可变切片149
15.7 开放式范围和切片操作150
第16章 使用迭代器152
16.1 字符串字符152
16.2 扫描字符串153
16.3 在for循环中使用迭代器155
16.3.1 不可变的迭代157
16.3.2 可变的迭代158
16.4 迭代器适配器:filter161
16.4.1 map迭代器适配器162
16.4.2 enumerate迭代器适配器163
16.5 迭代器消费者:any164
16.5.1 all迭代器消费者166
16.5.2 count迭代器消费者166
16.5.3 sum迭代器消费者166
16.5.4 min和max迭代器消费者167
16.5.5 collect消费者168
16.6 迭代器链169
16.7 迭代器是“惰性的”170
第17章 输入/输出和错误处理方式172
17.1 命令行参数172
17.2 进程返回码173
17.3 环境变量173
17.4 从控制台读取174
17.5 正确的运行时错误处理176
17.6 写入控制台179
17.7 将值转换为字符串179
17.8 文件输入/输出180
17.9 处理文本文件182
第18章 使用trait184
18.1 对trait的需求184
18.2 trait的补救186
18.3 没有trait界限的泛型函数188
18.4 trait作用域189
18.5 多函数trait190
18.6 方法192
18.7 "self"和"Self"关键字194
18.8 标准trait196
18.8.1 "Iterator" trait197
18.8.2 "type"关键字199
18.8.3 泛型trait200
18.8.4 使用关联类型简化泛型trait使用203
18.8.5 "Iterator"标准trait声明206
18.9 使用泛型迭代器208
第19章 面向对象程序设计210
19.1 固有实现210
19.2 Rust面向对象的特殊性213
19.3 可变方法216
19.4 构造函数217
19.5 组合而不是继承218
19.6 组合的内存使用情况220
19.6.1 静态分发221
19.6.2 动态分发223
19.6.3 trait引用的实现224
19.6.4 静态分发与动态分发226
第20章 标准库集合228
20.1 集合228
20.2 测量执行时间229
20.3 执行任意插入和移除230
20.4 队列231
20.5 链表234
20.6 二叉堆235
20.7 有序集和无序集236
20.8 有序字典和无序字典239
20.9 C 和Rust中的集合240
第21章 丢弃、移动和复制241
21.1 确定性析构241
21.2 所有权243
21.3 析构函数244
21.4 赋值语义248
21.4.1 复制与移动性能对比250
21.4.2 移动和销毁对象252
21.4.3 对复制语义的需要254
21.4.4 克隆对象255
21.4.5 使类型可克隆或可复制257
第22章 借用和生命周期259
22.1 所有权和借用259
22.2 对象生命周期260
22.3 关于借用的错误262
22.3.1 如何防止“丢弃后使用”错误264
22.3.2 如何防止“别名更改后使用”错误265
22.4 多重借用的可能情况266
22.5 使用块来限制借用作用域268
22.6 返回引用对生命周期说明符的需求269
22.6.1 生命周期说明符的用法和意义271
22.6.2 检查生命周期说明符的有效性273
22.6.3 使用调用函数的生命周期说明符276
第23章 关于生命周期的更多信息279
23.1 生命周期省略279
23.2 面向对象编程的生命周期省略280
23.3 结构对生命周期说明符的需要281
23.4 可能的结构生命周期说明符283
23.5 生命周期说明符的其他用途285
1.1 如何开始1
1.2 Hello,world!2
1.3 打印字面量字符串的组合3
1.4 打印多行文本4
1.5 打印整数5
1.6 命令行脚本6
1.7 注释6
第2章 算术运算8
2.1 整数加法8
2.2 整数之间的其他运算9
2.3 浮点运算10
2.4 语句序列11
2.5 分断字面量字符串12
第3章 命名对象14
3.1 将名称与值相关联14
3.2 可变变量16
3.3 未变化的可变变量17
3.4 未初始化的变量18
3.5 前导下划线19
3.6 布尔值20
3.7 布尔表达式22
3.8 赋值中的类型一致性23
3.9 类型和可变性的改变24
3.10 赋值算术运算符25
3.11 使用标准库的函数25
第4章 控制执行流27
4.1 条件语句(if)27
4.2 条件表达式29
4.3 条件循环(while)30
4.4 无限循环(loop)32
4.5 计数循环(for)33
4.6 变量作用域34
第5章 使用数据序列37
5.1 数组37
5.1.1 可变数组39
5.1.2 指定大小的数组40
5.1.3 多维数组41
5.2 向量42
5.3 空数组和空向量45
5.4 调试打印46
5.5 复制数组和向量47
第6章 使用基本类型48
6.1 非十进制数字基数48
6.2 数字字面量中的下划线50
6.3 指数表示法50
6.4 各种有符号整数51
6.5 无符号整数类型53
6.6 目标相关的整数类型54
6.7 类型推断55
6.8 浮点数值类型57
6.9 显式转换58
6.10 数字字面量的类型后缀59
6.11 所有数值类型60
6.12 布尔值和字符61
6.13 空元组62
6.14 数组和向量类型63
6.15 常数64
6.16 发现表达式的类型64
第7章 枚举情况66
7.1 枚举66
7.2 match构造68
7.3 关系运算符和枚举69
7.4 处理所有情况70
7.4.1 对数字使用match71
7.4.2 数据枚举72
7.4.3 “match”表达式74
7.4.4 在match结构中使用守卫75
第8章 使用异构数据结构76
8.1 元组76
8.2 结构77
8.3 元组结构80
8.4 词法约定80
第9章 定义函数82
9.1 定义和调用函数82
9.1.1 使用后定义的函数83
9.1.2 函数屏蔽其他函数83
9.1.3 将参数传递给函数85
9.1.4 按值传递参数86
9.2 从函数返回值86
9.2.1 提前退出87
9.2.2 返回多个值89
9.3 如何更改属于调用者的变量90
9.4 通过引用传递参数91
9.4.1 使用引用92
9.4.2 引用的可变性93
第10章 定义泛型函数和结构95
10.1 对泛型函数的需求95
10.2 定义和使用泛型函数96
10.3 推断参数类型97
10.4 定义和使用泛型结构98
10.4.1 泛型机制99
10.4.2 泛型数组和向量101
10.4.3 泛型枚举101
10.5 错误处理103
10.6 枚举标准实用程序函数104
第11章 分配内存106
11.1 各种分配106
11.1.1 线性寻址107
11.1.2 静态分配108
11.1.3 栈分配109
11.1.4 堆分配114
11.2 与C和C 的相似性117
11.3 装箱与拆箱117
11.4 寄存器分配119
第12章 数据实现120
12.1 探索对象的大小120
12.1.1 use指令121
12.1.2 基本类型的大小122
12.2 基本类型的表示122
12.3 字节在内存中的位置123
12.4 复合数据类型的大小125
12.5 向量分配125
第13章 定义闭包128
13.1 对“一次性”函数的需求128
13.2 捕获环境129
13.3 闭包130
13.4 其他例子132
第14章 使用可变字符串134
14.1 静态字符串134
14.2 动态字符串136
14.3 字符串的实现137
14.4 创建字符串139
14.5 连接字符串140
第15章 范围和切片142
15.1 范围142
15.2 将序列传递给函数144
15.3 切片145
15.4 切片操作147
15.5 超出范围的切片149
15.6 可变切片149
15.7 开放式范围和切片操作150
第16章 使用迭代器152
16.1 字符串字符152
16.2 扫描字符串153
16.3 在for循环中使用迭代器155
16.3.1 不可变的迭代157
16.3.2 可变的迭代158
16.4 迭代器适配器:filter161
16.4.1 map迭代器适配器162
16.4.2 enumerate迭代器适配器163
16.5 迭代器消费者:any164
16.5.1 all迭代器消费者166
16.5.2 count迭代器消费者166
16.5.3 sum迭代器消费者166
16.5.4 min和max迭代器消费者167
16.5.5 collect消费者168
16.6 迭代器链169
16.7 迭代器是“惰性的”170
第17章 输入/输出和错误处理方式172
17.1 命令行参数172
17.2 进程返回码173
17.3 环境变量173
17.4 从控制台读取174
17.5 正确的运行时错误处理176
17.6 写入控制台179
17.7 将值转换为字符串179
17.8 文件输入/输出180
17.9 处理文本文件182
第18章 使用trait184
18.1 对trait的需求184
18.2 trait的补救186
18.3 没有trait界限的泛型函数188
18.4 trait作用域189
18.5 多函数trait190
18.6 方法192
18.7 "self"和"Self"关键字194
18.8 标准trait196
18.8.1 "Iterator" trait197
18.8.2 "type"关键字199
18.8.3 泛型trait200
18.8.4 使用关联类型简化泛型trait使用203
18.8.5 "Iterator"标准trait声明206
18.9 使用泛型迭代器208
第19章 面向对象程序设计210
19.1 固有实现210
19.2 Rust面向对象的特殊性213
19.3 可变方法216
19.4 构造函数217
19.5 组合而不是继承218
19.6 组合的内存使用情况220
19.6.1 静态分发221
19.6.2 动态分发223
19.6.3 trait引用的实现224
19.6.4 静态分发与动态分发226
第20章 标准库集合228
20.1 集合228
20.2 测量执行时间229
20.3 执行任意插入和移除230
20.4 队列231
20.5 链表234
20.6 二叉堆235
20.7 有序集和无序集236
20.8 有序字典和无序字典239
20.9 C 和Rust中的集合240
第21章 丢弃、移动和复制241
21.1 确定性析构241
21.2 所有权243
21.3 析构函数244
21.4 赋值语义248
21.4.1 复制与移动性能对比250
21.4.2 移动和销毁对象252
21.4.3 对复制语义的需要254
21.4.4 克隆对象255
21.4.5 使类型可克隆或可复制257
第22章 借用和生命周期259
22.1 所有权和借用259
22.2 对象生命周期260
22.3 关于借用的错误262
22.3.1 如何防止“丢弃后使用”错误264
22.3.2 如何防止“别名更改后使用”错误265
22.4 多重借用的可能情况266
22.5 使用块来限制借用作用域268
22.6 返回引用对生命周期说明符的需求269
22.6.1 生命周期说明符的用法和意义271
22.6.2 检查生命周期说明符的有效性273
22.6.3 使用调用函数的生命周期说明符276
第23章 关于生命周期的更多信息279
23.1 生命周期省略279
23.2 面向对象编程的生命周期省略280
23.3 结构对生命周期说明符的需要281
23.4 可能的结构生命周期说明符283
23.5 生命周期说明符的其他用途285
猜您喜欢