计算机
类型
可以朗读
语音朗读
332千字
字数
2025-02-01
发行日期
展开全部
主编推荐语
Rust学习不可或缺的案头宝典。
内容简介
本书由Rust核心团队成员编写,由浅入深地探讨了Rust语言的方方面面。从创建函数、选择数据类型及绑定变量等基础内容着手,逐步介绍所有权、生命周期、trait、安全保证等高级概念,错误处理、模式匹配、包管理、并发机制、函数式特性等实用工具,以及完整的项目开发实战案例。
作为开源的系统级编程语言,Rust可以帮助你编写更有效率且更加可靠的软件,在给予开发者底层控制能力的同时,通过高水准的工程设计避免了传统语言带来的诸多麻烦。
目录
- 版权信息
- 内容简介
- 推荐语
- 译者序
- 序
- 说明
- 致谢
- 前言
- 1 入门指南
- 安装
- 在Linux或macOS环境中安装Rust
- 在Windows环境中安装Rust
- 常见问题
- 更新与卸载
- 本地文档
- Hello,world!
- 创建一个文件夹
- 编写并运行一个Rust程序
- Rust程序剖析
- 编译与运行是两个不同的步骤
- Hello,Cargo!
- 使用Cargo创建一个项目
- 使用Cargo构建和运行项目
- 以Release模式进行构建
- 学会习惯Cargo
- 总结
- 2 编写一个猜数游戏
- 创建一个新的项目
- 处理一次猜测
- 使用变量存储值
- 获得用户的输入
- 使用Result类型处理可能失败的情况
- 通过println!中的占位符输出对应的值
- 测试第一部分
- 生成一个保密数字
- 借助包获得更多功能
- 生成一个随机数
- 比较猜测数字与保密数字
- 使用循环实现多次猜测
- 在猜测成功时优雅地退出
- 处理非法输入
- 总结
- 3 通用编程概念
- 变量与可变性
- 常量
- 隐藏
- 数据类型
- 标量类型
- 复合类型
- 函数
- 参数
- 语句和表达式
- 函数的返回值
- 注释
- 控制流
- if表达式
- 使用循环重复执行代码
- 总结
- 4 认识所有权
- 什么是所有权
- 所有权规则
- 变量作用域
- String类型
- 内存与分配
- 所有权与函数
- 返回值与作用域
- 引用与借用
- 可变引用
- 悬垂引用
- 引用的规则
- 切片类型
- 字符串切片
- 其他类型的切片
- 总结
- 5 使用结构体组织相关联的数据
- 定义并实例化结构体
- 使用简化版的字段初始化方法
- 使用结构体更新语法,基于其他实例来创建新实例
- 使用不需要对字段命名的元组结构体来创建不同的类型
- 没有任何字段的单元结构体
- 一个使用结构体的示例程序
- 使用元组重构代码
- 使用结构体重构代码:增加有意义的描述信息
- 通过派生trait增加实用功能
- 方法
- 定义方法
- 带有更多参数的方法
- 关联函数
- 多个impl块
- 总结
- 6 枚举与模式匹配
- 定义枚举
- 枚举值
- Option枚举及其在空值处理方面的优势
- 控制流结构match
- 绑定值的模式
- 匹配Option<T>
- 匹配必须穷举所有的可能性
- 通配模式及_占位符
- 简单控制流if let
- 总结
- 7 使用包、单元包和模块管理日渐复杂的项目
- 包与单元包
- 通过定义模块来控制作用域及私有性
- 用于在模块树中指明条目的路径
- 使用pub关键字来暴露路径
- 从super关键字开始构造相对路径
- 将结构体或枚举声明为公共的
- 使用use关键字将路径导入作用域
- 创建use路径时的惯用方式
- 使用as关键字来提供新的名称
- 使用pub use重导出名称
- 使用外部包
- 使用嵌套路径来清理众多的use语句
- 通配符
- 将模块拆分为不同的文件
- 总结
- 8 通用集合类型
- 使用动态数组存储多个值
- 创建动态数组
- 更新动态数组
- 读取动态数组中的元素
- 遍历动态数组中的值
- 使用枚举存储多个类型的值
- 在销毁动态数组时也会销毁其中的元素
- 使用字符串存储UTF-8编码的文本
- 字符串是什么
- 创建一个新的字符串
- 更新字符串
- 索引字符串
- 字符串切片
- 遍历字符串的方法
- 字符串的确没那么简单
- 在哈希映射中存储键值对
- 创建一个新的哈希映射
- 访问哈希映射中的值
- 哈希映射与所有权
- 更新哈希映射
- 哈希函数
- 总结
- 9 错误处理
- 不可恢复错误与panic!
- 可恢复错误与Result
- 匹配不同的错误
- 传播错误
- 要不要使用panic!
- 示例、原型代码和测试
- 当你比编译器拥有更多信息时
- 错误处理指导原则
- 创建自定义类型进行有效性验证
- 总结
- 10 泛型、trait与生命周期
- 通过将代码提取为函数来减少重复工作
- 泛型数据类型
- 在函数定义中
- 在结构体定义中
- 在枚举定义中
- 在方法定义中
- 泛型代码的性能问题
- trait:定义共享行为
- 定义trait
- 为类型实现trait
- 默认实现
- 使用trait作为参数
- 返回实现了trait的类型
- 使用trait约束有条件地实现方法
- 使用生命周期保证引用的有效性
- 使用生命周期来避免悬垂引用
- 借用检查器
- 函数中的泛型生命周期
- 生命周期标注语法
- 函数签名中的生命周期标注
- 深入理解生命周期
- 结构体定义中的生命周期标注
- 生命周期省略
- 方法定义中的生命周期标注
- 静态生命周期
- 同时使用泛型参数、trait约束与生命周期
- 总结
- 11 编写自动化测试
- 如何编写测试
- 测试函数的构成
- 使用assert!宏检查结果
- 使用assert_eq!和assert_ne!宏判断相等性
- 添加自定义的错误提示信息
- 使用should_panic检查panic
- 使用Result<T,E>编写测试
- 控制测试的运行方式
- 并行或串行地运行测试
- 显示函数输出
- 运行部分特定名称的测试
- 通过显式指定来忽略某些测试
- 测试的组织结构
- 单元测试
- 集成测试
- 总结
- 12 I/O项目:编写一个命令行程序
- 接收命令行参数
- 读取参数值
- 将参数值存入变量中
- 读取文件
- 重构代码以增强模块化程度和错误处理能力
- 二进制项目的关注点分离
- 修正错误处理逻辑
- 从main中分离逻辑
- 将代码分离为独立的代码包
- 使用测试驱动开发编写库功能
- 编写一个会失败的测试
- 编写可以通过测试的代码
- 处理环境变量
- 为不区分大小写的search函数编写一个会失败的测试
- 实现search_case_insensitive函数
- 将错误提示信息打印到标准错误流而不是标准输出流
- 确认错误被写到了哪里
- 将错误提示信息打印到标准错误流
- 总结
- 13 函数式语言特性:迭代器与闭包
- 闭包:能够捕获环境的匿名函数
- 使用闭包捕获环境
- 闭包的类型推断和类型标注
- 捕获引用或移动所有权
- 将捕获的值移出闭包及Fn系列trait
- 使用迭代器处理元素序列
- Iterator trait和next方法
- 消耗迭代器的方法
- 生成其他迭代器的方法
- 使用闭包捕获环境
- 改进I/O项目
- 使用迭代器代替clone
- 使用迭代器适配器让代码更加清晰
- 在循环与迭代器之间做出选择
- 比较循环和迭代器的性能
- 总结
- 14 进一步认识Cargo及crates.io
- 使用发布配置定制构建
- 将包发布到crates.io平台
- 编写有用的文档注释
- 使用pub use导出合适的公共API
- 创建crates.io账户
- 为包添加元数据
- 发布到crates.io
- 发布已有包的新版本
- 使用cargo yank命令从crates.io上撤回版本
- Cargo工作空间
- 创建工作空间
- 在工作空间中创建第二个包
- 使用cargo install安装二进制文件
- 使用自定义命令扩展Cargo的功能
- 总结
- 15 智能指针
- 使用Box<T>在堆上分配数据
- 使用Box<T>在堆上存储数据
- 使用装箱定义递归类型
- 通过Deref trait将智能指针视作常规引用
- 跳转到指针指向的值
- 把Box<T>当成引用来操作
- 定义我们自己的智能指针
- 实现Deref trait
- 函数和方法的隐式解引用转换
- 解引用转换与可变性
- 借助Drop trait在清理时运行代码
- 基于引用计数的智能指针Rc<T>
- 使用Rc<T>共享数据
- 克隆Rc<T>会增加引用计数
- RefCell<T>和内部可变性模式
- 使用RefCell<T>在运行时检查借用规则
- 内部可变性:可变地借用一个不可变的值
- 结合使用Rc<T>和RefCell<T>来实现拥有多重所有权的可变数据
- 循环引用会造成内存泄漏
- 创建循环引用
- 使用Weak<T>代替Rc<T>来避免循环引用
- 总结
- 16 无畏并发
- 使用线程同时运行代码
- 使用spawn创建新线程
- 使用join句柄等待所有线程结束
- 在线程中使用move闭包
- 使用消息传递在线程间转移数据
- 通道和所有权转移
- 发送多个值并观察接收者的等待过程
- 通过克隆发送者创建多个生产者
- 共享状态的并发
- 互斥体一次只允许一个线程访问数据
- RefCell<T>/Rc<T>和Mutex<T>/Arc<T>之间的相似性
- 使用Send trait和Sync trait对并发进行扩展
- 允许线程间转移所有权的Send trait
- 允许多个线程同时访问的Sync trait
- 手动实现Send和Sync是不安全的
- 总结
- 17 Rust的面向对象编程特性
- 面向对象语言的特性
- 对象包含数据和行为
- 封装实现细节
- 作为类型系统和代码共享机制的继承
- 使用trait对象存储不同类型的值
- 为共有行为定义一个trait
- 实现trait
- trait对象会执行动态派发
- 实现一种面向对象的设计模式
- 定义Post并创建一个处于草稿状态的新实例
- 存储文章内容的文本
- 确保草稿的可读内容为空
- 请求审批文章并改变其状态
- 添加approve方法来改变content的行为
- 状态模式的权衡取舍
- 总结
- 18 模式与匹配
- 所有可以使用模式的场合
- match分支
- if let条件表达式
- while let条件循环
- for循环
- let语句
- 函数的参数
- 可失败性:模式是否会匹配失败
- 模式语法
- 匹配字面量
- 匹配命名变量
- 多重模式
- 使用“..=”匹配区间值
- 通过解构分解值
- 忽略模式中的值
- 使用匹配守卫添加额外条件
- @绑定
- 总结
- 19 高级特性
- 不安全Rust
- 不安全超能力
- 解引用裸指针
- 调用不安全的函数或方法
- 访问或修改可变静态变量
- 实现不安全trait
- 访问联合体中的字段
- 使用不安全代码的时机
- 高级trait
- 关联类型
- 默认泛型参数和运算符重载
- 消除同名方法在调用时的歧义
- 使用超trait
- 使用newtype模式在外部类型上实现外部trait
- 高级类型
- 使用newtype模式实现类型安全与抽象
- 使用类型别名创建同义类型
- 永不返回的never类型
- 动态大小类型和Sized trait
- 高级函数与闭包
- 函数指针
- 返回闭包
- 宏
- 宏与函数之间的区别
- 用于通用元编程的macro_rules!声明宏
- 基于属性创建代码的过程宏
- 如何编写一个自定义派生宏
- 属性宏
- 函数宏
- 总结
- 20 最后的项目:构建多线程Web服务器
- 构建单线程Web服务器
- 监听TCP连接
- 读取请求
- 仔细观察HTTP请求
- 编写响应
- 返回真正的HTML文件
- 验证请求的合法性并有选择地响应
- 少许重构
- 把单线程服务器修改为多线程服务器
- 模拟一个慢请求
- 使用线程池改进吞吐量
- 优雅地停机与清理
- 为ThreadPool实现Drop trait
- 通知线程停止监听任务
- 总结
- 附录A 关键字
- 附录B 运算符和符号
- 附录C 可派生trait
- 附录D 有用的开发工具
- 附录E 阶段性版本
展开全部
出版方
电子工业出版社
电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。