第一天:早上#
1. 什么是 Rust#
rust 是一种静态编译语言,其功能定位与 cpp 相似
- rustc 使用 LLVM 作为它的后端
- rust 和 cpp 适用于类似的场景
- 极高的灵活性。
- 高度的控制能力。
- Can be scaled down to very constrained devices such as microcontrollers.
- 没有运行时和垃圾收集。
- 关注程序可靠性和安全性,而不会牺牲任何性能。
2. 为什么选择 rust#
rust 的一些独特点:
- 编译器内存安全
- 没有运行时未定义行为
- 现代编程语言特性
2.1 编译期保障#
编译期静态内存管理:
- 不存在未初始化的变量。
- 不存在内存泄漏。
- 不存在 “双重释放”。
- 不存在 “释放后使用”。
- 不存在
NULL指针。 - 不存在被遗忘的互斥锁。
- 不存在线程之间的数据竞争。
- 不存在迭代器失效。
2.2 运行时保障#
Rust 没有运行时未定义行为:
- 数组访问有边界检查。
- Integer overflow is defined (panic or wrap-around).
2.3 现代特性#
语言特性:
- 枚举和模式匹配
- 泛型
- 无额外开销外 FFI
- 零成本抽象
工具:
- 强大的编译器错误提示
- 内置依赖管理器
- 对 UT 的内置支持
- 优秀的语言服务协议的实现
3. 基本语法#
3.1 标量类型#
| 类型 | 字面量 | |
|---|---|---|
| 有符号整数 | i8, i16, i32, i64, i128, isize | -10, 0, 1_000, 123_i64 |
| 无符号整数 | u8, u16, u32, u64, u128, usize | 0, 123, 10_u16 |
| 浮点数 | f32, f64 | 3.14, -10.0e20, 2_f32 |
| 字符串 | &str | "foo", "two\nlines" |
| Unicode 标量类型 | char | 'a', 'α', '∞' |
| 布尔值 | bool | true, false |
| 各类型占用的空间为: |
iN,uN和fN占用 N 位,isize和usize占用一个指针大小的空间,charis 32 bits wide,boolis 8 bits wide.
3.2 复合类型#
| 类型 | 字面量 | |
|---|---|---|
| 数组(Arrays) | [T; N] | [20, 30, 40], [0; 3] |
| 元组(Tuples) | (), (T,), (T1, T2), … | (), ('x',), ('x', 1.2), … |
| 数组的赋值和访问: |
fn main() {
let mut a: [i8; 10] = [42; 10];
a[5] = 0;
println!("a: {:?}", a);
}
元组的赋值和访问
fn main() {
let t: (i8, bool) = (7, true);
println!("t.0: {:?}", t.0);
println!("t.1: {:?}", t.1);
}
3.3 引用#
Rust 也提供了引用类型
fn main() {
let mut x: i32 = 10;
let ref_x: &mut i32 = &mut x;
*ref_x = 20;
println!("x: {x}");
}
注意 let mut ref_x: &i32 与 let ref_x: &mut i32 之间的区别,前者是声明了一个可变引用,我们可以修改这个引用绑定的值;后者声明了一个指向可变变量的引用。