C1 Hello Rust/Cargo
- 1.1 下载安装
- 1.2 编写Rust程序
- 1.3 Cargo
- 1.3.1 使用Cargo创建项目
- 1.3.2 如何使用Cargo
C2 Rust猜数游戏
C3 Rust通用编程概念
-
3.1 变量与可变性
- 3.1.1 变量
- 3.1.2 常量
- 3.1.2.1 常量constant
- 3.1.2.2 隐藏 shadowing
-
3.2 数据类型
- 3.2.1 标量类型
- 3.2.2 复合类型
- 3.2.2.1 元组(Tuple)
- 3.2.2.2 数组
-
3.3 函数
- 3.3.1 声明函数
- 3.3.2 函数参数
- 3.3.3 语句和表达式
- 3.3.4 函数的返回值
-
3.4 注释
-
3.5 控制流
- 3.5.1 if else表达式
- 3.5.2 循环
- 3.5.2.1 loop循环
- 3.5.2.2 while循环
- 3.5.2.3 for 循环遍历集合
C4 Rust所有权
-
4.1 所有权
- 4.1.1 什么是所有权
- 4.1.2 栈内存stack和堆内存heap
- 4.1.3 所有权存在的原因
-
4.2 所有权规则/内存与分配
- 4.2.1 所有权规则
- 4.2.2 变量作用域
- 4.2.3 String类型
-
4.3 所有权与函数
-
4.4 引用与借用
- 4.4.1 引用
- 4.4.2 借用
- 4.4.3 可变引用
- 4.4.3.1 可变引用的限制
- 4.4.4 悬空引用(Dangling References)
- 4.4.5 引用的规则
-
4.5 切片
- 4.5.1 字符串切片
- 4.5.2 其他类型的切片
C5 Rust struct
- 5.1 定义和实例化struct
- 5.1.1 定义struct
- 5.1.2 实例化struct
- 5.1.3 取得struct里面的某个值
- 5.1.4 注意
- 5.1.5 struct可以作为函数的返回值
- 5.1.6 字段初始化简写
- 5.1.7 struct更新语法
- 5.1.8 Tuple struct
- 5.1.9 Unit-Like Struct(没有任何字段)
- 5.1.10 struct数据的所有权
- 5.2 struct 例子
- 5.2.1 计算长方形面积的实现
- 5.2.2 输出一个struct
- 5.3 struct 方法
- 5.3.1 方法
- 5.3.2 关联函数
- 5.3.3 多个impl块
C6 枚举与模式匹配
- 6.1 定义枚举
- 6.1.1 如何获取枚举值
- 6.1.2 枚举变体
- 6.1.3 将数据附件到枚举的变体中(注意:这和C#中的枚举不太一样)
- 6.1.4 标准库中的IpAddr
- 6.1.5 一些例子
- 6.1.6 为枚举定义方法
- 6.2 Option枚举
- 6.2.1 Option枚举
- 6.2.2 Option的标准库定义
- 6.2.3 Option
<T>比Null好在哪
- 6.3 控制流运算符-match
- 6.3.1 match的定义
- 6.3.2 匹配Option
<T>
- 6.4 特殊的match: if let
C7 Package, Crate, Module
- 7.1 Package, Crate, Module
- 7.1.1 ChatGPT总结版
- 7.1.2 Package(包)------Cargo 管理的项目单位
- 7.1.3 Crate(编译单元)------Rust 的核心单位
- 7.1.4 Module(模块)------代码组织 & 命名空间
- 7.1.4.1 内联 module
- 7.1.4.2 文件 module(最常用)
- 7.1.4.3 目录 module(module tree)
- 7.1.5 可见性:pub 是边界
- 7.1.6 模块树
- 7.1.6.1 记得区分模块树和文件树
- 7.1.6.2 编译器构建模块树的三步流程
- 7.1.6.3 完整例子:从文件到模块树
- 7.1.6.4 mod 和"内联模块"是完全一样的
- 7.1.6.5 mod 不是 import(这是最常见误解)
- 7.1.6.6 pub 决定"路能不能走通"
- 7.2 路径Path
- 7.2.1 绝对路径(absolute path)
- 7.2.2 相对路径(relative path)
- 7.2.3 path 在不同地方,起点不一样
- 7.2.4 常见的path写法总结
- 7.3 use 关键字--"把路径搬到当前作用域"
- 7.3.1 为什么需要use
- 7.3.2 use 到底"引入"了什么?
- 7.4 将模块内容放到其他文件
C8 常用的集合
- 8.1 Vector
- 8.1.1 特性
- 8.1.2 创建Vector
- 8.1.2.1 创建一个空的vector
- 8.1.2.2 指定初始值的方式创建Vector
- 8.1.3 更新Vector
- 8.1.3.1 添加元素
- 8.1.4 删除Vector
- 8.1.5 读取Vector的元素
- 8.1.6 所有权和借用规则
- 8.1.7 遍历Vector中的值
- 8.1.8 使用enum来存储多种数据类型并且存在Vector中
- 8.2 String
- 8.2.1 String的难点
- 8.2.2 字符串是什么
- 8.2.3 创建String
- 8.2.4 更新String
- 8.2.5 String的内部表示
- 8.2.6 切割String
- 8.2.7 遍历String
- 8.3 HashMap
- 8.3.1 特性
- 8.3.2 创建
- 8.3.2.1 常见的创建方法:new
- 8.3.2.2 特殊的创建方法:collect
- 8.3.3 所有权
- 8.3.4 访问HashMap中得值
- 8.3.5 遍历HashMap
- 8.3.6 更新HashMap
- 8.3.6.1 K已经存在,替换现有的V
- 8.3.6.2 只有K不存在任何V的情况下,才插入V
- 8.3.6.3 基于现有V更新V
- 8.3.7 hash函数
C9 错误处理
- 9.1 panic! 不可恢复的错误
- 9.2 Result枚举类型
- 9.2.1 定义
- 9.2.2 如何处理Result的结果:match表达式
- 9.2.3 unwrap 取代match
- 9.2.4 except:可以指定信息的unwrap
- 9.3 传播错误
- 9.3.1传播错误: 将错误传给调用者
- 9.3.2 ?运算符
- 9.3.3 ?与from函数
- 9.3.4 ?只能用于返回Result函数
- 9.4 什么时候应该使用panic!
- 9.4.1 总体原则
C10 泛型,Trait,生命周期
- 10.1 提取函数以消除重复代码
- 10.1.1 例子
- 10.1.2
疑问:为什么 if item > largest { 这里使用的是item而不是&item?
- 10.2 泛型
- 10.2.1 定义
- 10.2.2 函数定义中的泛型
- 10.2.3 struct结构体中 定义的泛型
- 10.2.4 enum枚举类型中 ->主要让枚举的变体持有泛型数据
- 10.2.5 方法定义中的泛型
- 10.2.6 泛型代码的性能
- 10.3 Trait
- 10.3.1 功能
- 10.3.2 定义一个trait
- 10.3.3 在类型上实现trait
- 10.3.3.1 一般写法
- 10.3.3.2 默认实现
- 10.3.3.3 默认实现的方法可以调用trait中其他的方法
- 10.3.4 trait作为参数
- 10.3.4.1 impl Trait 语法:适用于简单情况
- 10.3.4.2 Trait bound 语法:适用于复杂情况
- 10.3.4.3 使用+指定多个Trait bound
- 10.3.4.4 Trait bound 使用where子句
- 10.3.5 实现Trait作为返回类型
- 10.3.5.1 impl Trait 语法
- 10.3.5.2 使用Trait Bound
- 10.3.5.2 使用Trait Bound有条件的实现方法
- 10.4 生命周期
- 10.4.1 生命周期的简单定义
- 10.4.2 避免悬垂引用(dangling reference)
- 10.4.3 函数中的泛型生命周期
- 10.4.4 生命周期标注语法
- 10.4.5 函数签名中的生命周期标注
- 10.4.6 深入理解生命周期
- 10.4.7 struct定义中的生命周期标注
- 10.4.8 生命周期的省略规则
- 10.4.9 结构体添加生命周期标注
- 10.4.10 静态生命周期
C11 编写自动化测试
- 11.1 编写和运行测试
- 11.1.1 测试函数
- 11.1.2 解剖测试函数
- 11.1.3 运行测试
- 11.2 断言(Assert)
- 11.2.1 使用assert! 宏检查测试结果
- 11.2.2 使用assert_eq!和assert_ne!测试相等性
- 11.3 自定义错误消息
- 11.3.1 添加自定义错误消息
- 11.4 用should_panic检查恐慌
- 11.4.1 验证错误处理的情况 should_panic
- 11.4.2 让 should_panic更精确,expected
- 11.5 在测试中使用Result<T,E>
- 11.6 控制测试运行
- 11.6.1 控制测试如何运行
- 11.6.2 并行/连续运行测试
- 11.6.3 --test-threads参数
- 11.6.4 显式函数输出
- 11.7 按名称运行测试
- 11.7.1 按名称运行测试的子集
- 11.8 忽略测试
- 11.9 集成测试
- 11.9.1 测试的分类
- 11.9.2 单元测试
- 11.9.3 集成测试
- 11.9.3.1 运行集成测试
- 11.9.3.2 运行指定的集成测试