没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Rust 程序设计语言简体中文版
Steve Klabnik 和 Carol Nichols,以及来自 Rust 社区的贡献(Rust 中文社区翻译)
2
Contents
Rust 程序设计语言 11
前言 13
简介 15
1 入门指南 23
1.1 安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.1.1 命令行标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.1.2 在 Linux 或 macOS 上安装 rustup . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.1.3 在 Windows 上安装 rustup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.1.4 检查安装是否正确(Troubleshooting) . . . . . . . . . . . . . . . . . . . . . . . . 25
1.2 更新与卸载 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.2.1 本地文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.3 Hello, World! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.3.1 创建项目目录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.3.2 编写并运行 Rust 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.3.3 分析这个 Rust 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.3.4 编译和运行是彼此独立的步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.4 Hello, Cargo! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.4.1 使用 Cargo 创建项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.4.2 构建并运行 Cargo 项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1.4.3 发布(release)构建 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.4.4 把 Cargo 当作习惯 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2 写个猜数字游戏 35
2.1 准备一个新项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.2 处理一次猜测 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.2.1 使用变量储存值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.2.2 接收用户输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.2.3 使用 Result 类型来处理潜在的错误 . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.2.4 使用 println! 占位符打印值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.2.5 测试第一部分代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.3 生成一个秘密数字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.3.1 使用 crate 来增加更多功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.3.2 生成一个随机数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.4 比较猜测的数字和秘密数字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.5 使用循环来允许多次猜测 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.5.1 猜测正确后退出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
2.5.2 处理无效输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
2.6 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3 常见编程概念 57
3.1 关键字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.2 变量和可变性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.2.1 常量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3
4 CONTENTS
3.2.2 隐藏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.3 数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.3.1 标量类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.3.2 复合类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.4 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.4.1 参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.4.2 语句和表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.4.3 具有返回值的函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.5 注释 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.6 控制流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.6.1 if 表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.6.2 使用循环重复执行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.7 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4 认识所有权 85
4.1 什么是所有权? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.1.1 栈(Stack)与堆(Heap) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.1.2 所有权规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.1.3 变量作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.1.4 String 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.1.5 内存与分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.1.6 所有权与函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
4.1.7 返回值与作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.2 引用与借用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
4.2.1 可变引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4.2.2 悬垂引用(Dangling References) . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.2.3 引用的规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.3 Slice 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
4.3.1 字符串 slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
4.3.2 其他类型的 slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
4.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5 使用结构体组织相关联的数据 113
5.1 结构体的定义和实例化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
5.1.1 使用字段初始化简写语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
5.1.2 使用结构体更新语法从其他实例创建实例 . . . . . . . . . . . . . . . . . . . . . . . . 116
5.1.3 使用没有命名字段的元组结构体来创建不同的类型 . . . . . . . . . . . . . . . . . . . 117
5.1.4 没有任何字段的类单元结构体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
5.1.5 结构体数据的所有权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
5.2 结构体示例程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
5.2.1 使用元组重构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.2.2 使用结构体重构:赋予更多意义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.2.3 通过派生 trait 增加实用功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
5.3 方法语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.3.1 定义方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.3.2 -> 运算符到哪去了? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.3.3 带有更多参数的方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.3.4 关联函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
5.3.5 多个 impl 块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
5.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6 枚举和模式匹配 133
6.1 枚举的定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
6.1.1 枚举值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
6.1.2 Option 枚举和其相对于空值的优势 . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
6.2 match 控制流结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
6.2.1 绑定值的模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.2.2 匹配 Option<T> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
CONTENTS 5
6.2.3 匹配是穷尽的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.2.4 通配模式和 _ 占位符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.3 if let 简洁控制流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
6.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
7 使用包、Crate 和模块管理不断增长的项目 151
7.1 包和 Crate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
7.2 定义模块来控制作用域与私有性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
7.3 模块小抄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
7.3.1 在模块中对相关代码进行分组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
7.4 引用模块项目的路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
7.4.1 使用 pub 关键字暴露路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7.4.2 使用 super 起始的相对路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
7.4.3 创建公有的结构体和枚举 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
7.5 使用 use 关键字将路径引入作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
7.5.1 创建惯用的 use 路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
7.5.2 使用 as 关键字提供新的名称 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
7.5.3 使用 pub use 重导出名称 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
7.5.4 使用外部包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
7.5.5 嵌套路径来消除大量的 use 行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
7.5.6 通过 glob 运算符将所有的公有定义引入作用域 . . . . . . . . . . . . . . . . . . . . 167
7.6 将模块拆分成多个文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
7.7 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
8 常见集合 171
8.1 使用 Vector 储存列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
8.1.1 新建 vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
8.1.2 更新 vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
8.1.3 丢弃 vector 时也会丢弃其所有元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
8.1.4 读取 vector 的元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
8.1.5 遍历 vector 中的元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
8.1.6 使用枚举来储存多种类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
8.2 使用字符串储存 UTF-8 编码的文本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
8.2.1 什么是字符串? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
8.2.2 新建字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
8.2.3 更新字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
8.2.4 索引字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
8.2.5 字符串 slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
8.2.6 遍历字符串的方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
8.2.7 字符串并不简单 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
8.3 使用 Hash Map 储存键值对 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
8.3.1 新建一个哈希 map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
8.3.2 哈希 map 和所有权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
8.3.3 访问哈希 map 中的值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
8.3.4 更新哈希 map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
8.3.5 哈希函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
8.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
9 错误处理 191
9.1 用 panic! 处理不可恢复的错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
9.1.1 对应 panic 时的栈展开或终止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
9.1.2 使用 panic! 的 backtrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
9.2 用 Result 处理可恢复的错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
9.2.1 匹配不同的错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
9.2.2 失败时 panic 的简写:unwrap 和 expect . . . . . . . . . . . . . . . . . . . . . . . 197
9.2.3 传播错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
9.2.4 传播错误的简写:? 运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
9.2.5 哪里可以使用 ? 运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
剩余593页未读,继续阅读
资源评论
夜-鸽
- 粉丝: 7
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功