欢迎来到 Comprehensive Rust 🦀
1.
授课
❱
1.1.
课程结构
1.2.
键盘快捷键
1.3.
翻译
2.
使用 Cargo
❱
2.1.
Rust 生态系统
2.2.
代码示例
2.3.
在本地运行 Cargo
第一天:早上
3.
欢迎
❱
3.1.
什么是 Rust?
4.
Hello World!
❱
4.1.
简短示例
5.
为什么选择 Rust?
❱
5.1.
C语言示例
5.2.
编译期保障
5.3.
运行时保障
5.4.
现代特性
6.
基本语法
❱
6.1.
标量类型
6.2.
复合类型
6.3.
引用
❱
6.3.1.
悬垂引用
6.4.
切片
❱
6.4.1.
String 和 str
6.5.
函数
❱
6.5.1.
Rustdoc
6.5.2.
方法
6.5.3.
重载
7.
习题
❱
7.1.
隐式类型转换
7.2.
数组与 for 循环
第一天:下午
8.
控制流
❱
8.1.
块
8.2.
if 表达式
8.3.
for 表达式
8.4.
while 表达式
8.5.
break & continue
8.6.
loop 表达式
9.
变量
❱
9.1.
类型推导
9.2.
静态与常量
9.3.
作用域和隐藏 (Shadowing)
10.
枚举
❱
10.1.
变体载荷
10.2.
枚举大小
11.
Novel Control Flow
❱
11.1.
if let 表达式
11.2.
while let 表达式
11.3.
match 表达式
12.
模式匹配
❱
12.1.
解构枚举
12.2.
解构结构体
12.3.
解构数组
12.4.
匹配守卫
13.
习题
❱
13.1.
Luhn 算法
13.2.
模式匹配
第二天:上午
14.
欢迎
15.
内存管理
❱
15.1.
栈 vs 堆
15.2.
栈内存
15.3.
手动内存管理
15.4.
基于作用域的内存管理
15.5.
垃圾回收
15.6.
Rust 内存管理
16.
所有权
❱
16.1.
移动语义
16.2.
Rust 中移动的字符串
❱
16.2.1.
现代 C++ 中的双重释放
16.3.
函数调用中的移动
16.4.
复制和克隆
16.5.
借用
❱
16.5.1.
共享和唯一的借用
16.6.
生命周期
16.7.
函数调用中的生命周期
16.8.
数据结构中的生命周期
17.
结构体
❱
17.1.
元组结构体
17.2.
字段简写语法
18.
方法
❱
18.1.
方法接收者
18.2.
示例
19.
习题
❱
19.1.
Storing Books
19.2.
健康统计
第二天:下午
20.
标准库
❱
20.1.
Option 和 Result
20.2.
String
20.3.
Vec
20.4.
哈希表
20.5.
Box
❱
20.5.1.
递归数据类型
20.5.2.
小众优化
20.6.
Rc
20.7.
Cell/RefCell
21.
模块
❱
21.1.
可见性
21.2.
路径
21.3.
文件系统层级结构
22.
习题
❱
22.1.
迭代器和所有权
22.2.
字符串和迭代器
第三天:上午
23.
欢迎
24.
泛型
❱
24.1.
通用数据类型
24.2.
泛型方法
24.3.
单态化
25.
特征
❱
25.1.
特征(Trait)对象
25.2.
派生特征
25.3.
默认方法
25.4.
特征边界
25.5.
impl Trait
26.
重要特征
❱
26.1.
迭代器
26.2.
FromIterator
26.3.
From 和 Into
26.4.
读取和写入
26.5.
Drop
26.6.
Default
26.7.
运算符:Add、Mul...
26.8.
闭包:Fn、FnMut、FnOnce
27.
习题
❱
27.1.
一个简单的 GUI 库
27.2.
点和多边形
第三天:下午
28.
错误处理
❱
28.1.
Panics
❱
28.1.1.
捕获堆栈展开
28.2.
结构化错误处理
28.3.
使用 ? 传播错误
❱
28.3.1.
转换错误类型
❱
28.3.1.1.
示例
28.3.2.
派生错误枚举
28.3.3.
动态错误类型
28.3.4.
为错误添加背景信息
29.
测试
❱
29.1.
单元测试
29.2.
测试模块
29.3.
文档测试
29.4.
集成测试
29.5.
实用 crate
30.
不安全 Rust
❱
30.1.
解引用裸指针
30.2.
可变的静态变量
30.3.
联合体
30.4.
调用 Unsafe 函数
❱
30.4.1.
编写 Unsafe 函数
30.4.2.
外部函数
30.5.
实现 Unsafe Trait
31.
习题
❱
31.1.
安全 FFI 封装容器
Android
32.
欢迎
33.
设置
34.
构建规则
❱
34.1.
可执行文件
34.2.
库
35.
AIDL
❱
35.1.
接口
35.2.
实现
35.3.
服务器
35.4.
部署
35.5.
客户端
35.6.
更改 API
36.
日志记录
37.
互操作性
❱
37.1.
与 C 语言交互
❱
37.1.1.
使用Bindgen调用C语言
37.1.2.
从C语言调用Rust语言
37.2.
与 C++ 交互
37.3.
与 Java 交互
38.
习题
裸机:上午
39.
欢迎
40.
no_std
❱
40.1.
最小示例
40.2.
alloc
41.
微控制器
❱
41.1.
原始 MMIO
41.2.
PAC
41.3.
HAL crate
41.4.
板级支持 Crate
41.5.
类型状态模式
41.6.
embedded-hal
41.7.
probe-rs、cargo-embed
❱
41.7.1.
Debugging
41.8.
其他项目
42.
习题
❱
42.1.
罗盘
裸机:下午
43.
应用处理器
❱
43.1.
准备使用 Rust
43.2.
内嵌汇编
43.3.
MMIO
43.4.
编写 UART 驱动程序
❱
43.4.1.
更多 trait
43.5.
一个更好的 UART 驱动程序
❱
43.5.1.
Bitflags
43.5.2.
多个寄存器
43.5.3.
驱动程序
43.5.4.
开始使用
43.6.
日志记录
❱
43.6.1.
开始使用
43.7.
Exceptions
43.8.
其他项目
44.
实用 crate
❱
44.1.
zerocopy
44.2.
aarch64-paging
44.3.
buddy_system_allocator
44.4.
tinyvec
44.5.
转动
45.
Android
❱
45.1.
vmbase
46.
习题
❱
46.1.
RTC驱动
并发编程:入门篇
47.
欢迎
48.
线程
❱
48.1.
范围线程
49.
通道
❱
49.1.
无界通道
49.2.
有界通道
50.
Send 和 Sync
❱
50.1.
Send
50.2.
Sync
50.3.
示例
51.
共享状态
❱
51.1.
Arc
51.2.
Mutex
51.3.
示例
52.
习题
❱
52.1.
哲学家就餐问题 (Dining philosophers problem)
52.2.
多线程链接检查器
并发:下午
53.
异步基础
❱
53.1.
async/await
53.2.
Futures
53.3.
Runtimes
❱
53.3.1.
Tokio
53.4.
任务
53.5.
异步通道
54.
控制流
❱
54.1.
加入
54.2.
选择
55.
误区
❱
55.1.
屏蔽执行器
55.2.
固定
55.3.
异步特质
55.4.
Cancellation
56.
习题
❱
56.1.
哲学家就餐问题 (Dining philosophers problem)
56.2.
广播聊天应用程序
结束语
57.
谢谢!
58.
Glossary
59.
其他资源
60.
鸣谢
解答
61.
解答
❱
61.1.
第一天上午
61.2.
第一天下午
61.3.
第二天上午
61.4.
第二天下午
61.5.
第三天上午
61.6.
第三天下午
61.7.
嵌入式 Rust:入门篇
61.8.
嵌入式 Rust:进阶篇
61.9.
并发编程:入门篇
61.10.
并发编程:进阶篇
Light
Rust
Coal
Navy
Ayu
Comprehensive Rust 🦀
English
Brazilian Portuguese (Português do Brasil)
Chinese Simplified (汉语)
Korean (한국어)
Spanish (Español)
错误处理
Rust 中的错误处理是使用显式控制流来进行的:
包含错误的函数会在返回类型中列出相关信息。
此规则没有例外。