欢迎来到 Comprehensive Rust 🦀
1.
授课
❱
1.1.
课程结构
1.2.
键盘快捷键
1.3.
翻译
2.
使用 Cargo
❱
2.1.
Rust 生态系统
2.2.
代码示例
2.3.
在本地运行 Cargo
第一天:早上
3.
欢迎
4.
Hello World!
❱
4.1.
什么是 Rust?
4.2.
Hello World!
4.3.
Rust 的优势
4.4.
Playground
5.
类型和值
❱
5.1.
变量
5.2.
值
5.3.
算术
5.4.
字符串
5.5.
类型推导
5.6.
练习:Fibonacci
❱
5.6.1.
解答
6.
控制流
❱
6.1.
条件语句
6.2.
“for”循环
6.3.
break 和 continue
6.4.
代码块和作用域
6.5.
函数
6.6.
宏
6.7.
练习:考拉兹序列
❱
6.7.1.
解答
第一天:下午
7.
欢迎
8.
元组和数组
❱
8.1.
元组和数组
8.2.
迭代器
8.3.
模式匹配
8.4.
解构枚举
8.5.
练习:嵌套数组
❱
8.5.1.
解答
9.
引用
❱
9.1.
共享引用
9.2.
悬垂引用
9.3.
练习:几何图形
❱
9.3.1.
解答
10.
用户定义的类型
❱
10.1.
结构体
10.2.
元组结构体
10.3.
枚举
10.4.
静态变量与常量
10.5.
类型别名
10.6.
练习:电梯事件
❱
10.6.1.
解答
第二天:上午
11.
欢迎
12.
模式匹配
❱
12.1.
解构枚举
12.2.
控制流
12.3.
练习:表达式求值
❱
12.3.1.
解答
13.
方法和特征
❱
13.1.
方法
13.2.
特征(Trait)
13.3.
派生特征
13.4.
练习:通用 min 函数
❱
13.4.1.
解答
14.
泛型
❱
14.1.
外部函数
14.2.
通用数据类型
14.3.
特征边界
14.4.
impl Trait
14.5.
练习:通用 min 函数
❱
14.5.1.
解答
第二天:下午
15.
欢迎
16.
标准库
❱
16.1.
标准库
16.2.
文档测试
16.3.
Option
16.4.
Result
16.5.
String
16.6.
Vec
16.7.
HashMap
16.8.
练习:计数器
❱
16.8.1.
解答
17.
标准库
❱
17.1.
对比项
17.2.
迭代器
17.3.
From 和 Into
17.4.
测试
17.5.
Read 和 Write
17.6.
Default,结构体更新语法
17.7.
闭包
17.8.
练习:ROT13
❱
17.8.1.
解答
第三天:上午
18.
欢迎
19.
内存管理
❱
19.1.
对程序内存进行审查
19.2.
自动内存管理
19.3.
所有权
19.4.
移动语义
19.5.
Clone
19.6.
复合类型
19.7.
Drop
19.8.
练习:构建器类型
❱
19.8.1.
解答
20.
智能指针
❱
20.1.
Box<T>
20.2.
Rc
20.3.
特征对象
20.4.
练习:二进制文件树
❱
20.4.1.
解答
第三天:下午
21.
欢迎
22.
借用
❱
22.1.
借用
22.2.
借用
22.3.
互操作性
22.4.
练习:健康统计
❱
22.4.1.
解答
23.
生命周期
❱
23.1.
Slices: &\[T\]
23.2.
悬垂引用
23.3.
函数调用中的生命周期
23.4.
生命周期
23.5.
生命周期
23.6.
练习:Protobuf 解析
❱
23.6.1.
解答
第一天:早上
24.
欢迎
25.
迭代器
❱
25.1.
“Iterator”
25.2.
“IntoIterator”
25.3.
FromIterator
25.4.
练习:迭代器方法链接
❱
25.4.1.
解答
26.
模块
❱
26.1.
模块
26.2.
文件系统层级结构
26.3.
可见性
26.4.
use、super、self
26.5.
练习:面向 GUI 库的模块
❱
26.5.1.
解答
27.
测试
❱
27.1.
测试模块
27.2.
其他资源
27.3.
实用 crate
27.4.
GoogleTest
27.5.
模拟
27.6.
编译器 lint 和 Clippy
27.7.
卢恩算法
❱
27.7.1.
解答
第一天:下午
28.
欢迎
29.
错误处理
❱
29.1.
Panics
29.2.
迭代器
29.3.
隐式类型转换
29.4.
Drop 特征
29.5.
From 和 Into
29.6.
使用 Result 进行结构化错误处理
❱
29.6.1.
解答
30.
不安全 Rust
❱
30.1.
是(不安全)
30.2.
解引用裸指针
30.3.
可变的静态变量
30.4.
联合体
30.5.
调用 Unsafe 函数
30.6.
实现 Unsafe Trait
30.7.
练习:FFI 封装容器
❱
30.7.1.
解答
Android
31.
欢迎
32.
设置
33.
构建规则
❱
33.1.
可执行文件
33.2.
库
34.
AIDL
❱
34.1.
接口
34.2.
实现
34.3.
服务器
34.4.
部署
34.5.
客户端
34.6.
更改 API
35.
日志记录
36.
互操作性
❱
36.1.
与 C 语言交互
❱
36.1.1.
使用 Bindgen 调用 C 语言
36.1.2.
从 C 语言调用 Rust 语言
36.2.
与 C++ 交互
❱
36.2.1.
测试模块
36.2.2.
Rust 桥接
36.2.3.
生成的 C++
36.2.4.
C++ 桥接
36.2.5.
共享类型
36.2.6.
共享枚举
36.2.7.
错误处理
36.2.8.
错误处理
36.2.9.
其他类型
36.2.10.
针对 Android 进行构建:C++
36.2.11.
针对 Android 进行构建:Genrule
36.2.12.
针对 Android 进行构建:Rust
36.3.
与 Java 交互
37.
习题
Chromium
38.
欢迎
39.
设置
40.
比较 Chromium 和 Cargo 生态系统
41.
政策
42.
构建规则
❱
42.1.
不安全 Rust
42.2.
根据 Chromium C++ 中的 Rust 代码
42.3.
Visual Studio Code
42.4.
练习
43.
测试
❱
43.1.
rust_gtest_interop Library
43.2.
GN Rules for Rust Tests
43.3.
chromium::import! Macro
43.4.
练习
44.
与 C 的互操作性
❱
44.1.
示例
44.2.
CXX 的局限性
44.3.
错误处理
❱
44.3.1.
错误处理
44.3.2.
错误处理
44.4.
在 Chromium 中使用 CXX
44.5.
练习
45.
添加第三方 crate
❱
45.1.
配置 Cargo.toml
45.2.
配置 gnrt_config.toml
45.3.
下载 crate
45.4.
生成 gn 构建规则
45.5.
解决问题
❱
45.5.1.
用于生成代码的构建脚本
45.5.2.
用于构建 C++ 或执行任意操作的构建脚本
45.6.
依赖于 crate
45.7.
审查和审核
45.8.
签入 Chromium 源代码
45.9.
始终使用最新版 crate
45.10.
练习
46.
综合应用练习
47.
练习题解答
裸金属:上午
48.
欢迎
49.
no_std
❱
49.1.
最小示例
49.2.
alloc
50.
微控制器
❱
50.1.
原始 MMIO
50.2.
PAC
50.3.
HAL crate
50.4.
板级支持 Crate
50.5.
类型状态模式
50.6.
embedded-hal
50.7.
probe-rs、cargo-embed
❱
50.7.1.
调试
50.8.
其他项目
51.
习题
❱
51.1.
罗盘
51.2.
解答
裸金属:下午
52.
应用处理器
❱
52.1.
准备使用 Rust
52.2.
内联汇编
52.3.
MMIO
52.4.
编写 UART 驱动程序
❱
52.4.1.
更多 trait
52.5.
一个更好的 UART 驱动程序
❱
52.5.1.
Bitflags
52.5.2.
多个寄存器
52.5.3.
驱动程序
52.5.4.
开始使用
52.6.
日志记录
❱
52.6.1.
开始使用
52.7.
异常
52.8.
其他项目
53.
实用 crate
❱
53.1.
zerocopy
53.2.
aarch64-paging
53.3.
buddy_system_allocator
53.4.
tinyvec
53.5.
spin
54.
Android
❱
54.1.
vmbase
55.
习题
❱
55.1.
RTC驱动
55.2.
解答
并发编程:上午
56.
欢迎
57.
线程
❱
57.1.
范围线程
58.
通道
❱
58.1.
无界通道
58.2.
有界通道
59.
Send 和 Sync
❱
59.1.
Send
59.2.
Sync
59.3.
示例
60.
共享状态
❱
60.1.
Arc
60.2.
互斥器 (Mutex)
60.3.
示例
61.
习题
❱
61.1.
哲学家就餐问题 (Dining philosophers problem)
61.2.
多线程链接检查器
61.3.
解答
并发:下午
62.
异步基础
❱
62.1.
async/await
62.2.
Futures
62.3.
Runtimes
❱
62.3.1.
Tokio
62.4.
任务
62.5.
异步通道
63.
控制流
❱
63.1.
加入
63.2.
选择
64.
误区
❱
64.1.
屏蔽执行器
64.2.
Pin
64.3.
异步特质
64.4.
消除
65.
习题
❱
65.1.
哲学家就餐问题 (Dining philosophers problem)
65.2.
广播聊天应用程序
65.3.
解答
结束语
66.
谢谢!
67.
词汇表
68.
其他资源
69.
鸣谢
Light
Rust
Coal
Navy
Ayu
Comprehensive Rust 🦀
English
Brazilian Portuguese (Português do Brasil)
Chinese Simplified (汉语)
Chinese Traditional (漢語)
Korean (한국어)
Spanish (Español)
习题
我们将从 I2C 罗盘读取方向,并将读数记录到串行端口。
After looking at the exercises, you can look at the
solutions
provided.