新書推薦:
《
马长寿内陆欧亚学文存(全三集)
》
售價:NT$
2030.0
《
银行业刑事风险防控与应对
》
售價:NT$
449.0
《
语言、使用与认知
》
售價:NT$
321.0
《
帝国的叙事话语:国家身份塑造与冷战时期美国外交政策 北京大学人文学科文库
》
售價:NT$
704.0
《
世界上的城堡:一部千年古堡兴衰史(从军事建筑到中世纪城堡,59座经典古堡,高清全彩图文,精装收藏品质)
》
售價:NT$
1214.0
《
缪斯的诞生 现代西方艺术观念生成简史
》
售價:NT$
398.0
《
信念危机:投资者心理与金融脆弱性
》
售價:NT$
347.0
《
喵星语解密手册
》
售價:NT$
403.0
內容簡介:
本书由Rust核心开发团队编写而成,由浅入深地探讨了Rust语言的方方面面。从学习函数、选择数据结构及绑定变量入手,逐步介绍所有权、trait、生命周期、安全保证等高级概念,模式匹配、错误处理、包管理、函数式特性、并发机制等实用工具,以及两个完整的项目开发实战案例。 作为开源的系统级编程语言,Rust可以帮助你编写出更为快速且更为可靠的软件,在给予开发者底层控制能力的同时,通过深思熟虑的工程设计避免了传统语言带来的诸多麻烦。
關於作者:
Steve?Klabnik曾是Rust的核心开发者及Rust文档团队的负责人。他时常参与各种演讲,并且是一位十分多产的开源贡献者。Carol?Nichols曾是Rust核心团队中的成员,目前是Rust Crates.io团队成员,也是Integer?32公司(全球首家专注于Rust的软件咨询公司)的联合创始人,以及Rust Belt Rust(Rust铁锈地带)会议的组织者。游戏设计师,一直专注于游戏领域研发,曾负责设计和维护了多个商业游戏的基础框架。业余时间活跃于Rust开源社区,并尝试使用Rust来解决游戏领域中的诸多问题。
目錄 :
1 入门指南1 安装1 在Linux或macOS环境中安装Rust2 在Windows环境中安装Rust3 常见问题3 更新与卸载4 本地文档5 Hello, world!5 创建一个文件夹5 编写并运行一个Rust程序6 Rust程序剖析7 编译与运行是两个不同的步骤8 Hello, Cargo!10 使用Cargo创建一个项目10 使用Cargo构建和运行项目13 以Release模式进行构建15 学会习惯Cargo15 总结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 控制流结构match143 绑定值的模式145 匹配Option<T>146 匹配必须穷举所有的可能性148 通配模式及_占位符149 简单控制流if let151 总结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 可恢复错误与Result215 匹配不同的错误217 传播错误221 要不要使用panic!229 示例、原型代码和测试229 当你比编译器拥有更多信息时230 错误处理指导原则230 创建自定义类型进行有效性验证232 总结235 10 泛型、trait与生命周期236 通过将代码提取为函数来减少重复工作237 泛型数据类型240 在函数定义中240 在结构体定义中243 在枚举定义中245 在方法定义中246 泛型代码的性能问题249 trait:定义共享行为250 定义trait250 为类型实现trait251 默认实现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检查panic295 使用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系列trait366 使用迭代器处理元素序列371 Iterator trait和next方法372 消耗迭代器的方法373 生成其他迭代器的方法374 使用闭包捕获环境376 改进I/O项目378 使用迭代器代替clone378 使用迭代器适配器让代码更加清晰382 在循环与迭代器之间做出选择383 比较循环和迭代器的性能383 总结386 14 进一步认识Cargo及crates.io387 使用发布配置定制构建388 将包发布到crates.io平台389 编写有用的文档注释390 使用pub use导出合适的公共API393 创建crates.io账户398 为包添加元数据398 发布到crates.io400 发布已有包的新版本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 trait424 函数和方法的隐式解引用转换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 trait487 允许多个线程同时访问的Sync trait488 手动实现Send和Sync是不安全的488 总结489 17 Rust的面向对象编程特性490 面向对象语言的特性490 对象包含数据和行为491 封装实现细节491 作为类型系统和代码共享机制的继承493 使用trait对象存储不同类型的值495 为共有行为定义一个trait496 实现trait498 trait对象会执行动态