Comprehensive Rust教程

第一天：早上

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 占用一个指针大小的空间，

char is 32 bits wide,

bool is 8 bits wide.

3.2 复合类型

| 类型 | 字面量
数组（Arrays） | [T; N] | [20, 30, 40], [0; 3]
元组（Tuples） | (), (T,), (T1, T2), … | (), ('x',), ('x', 1.2), …
数组的赋值和访问： | |

Copy
fn main() {
let mut a: [i8; 10] = [42; 10];
a[5] = 0;
println!("a: {:?}", a);
}

元组的赋值和访问

Copy
fn main() {
let t: (i8, bool) = (7, true);
println!("t.0: {:?}", t.0);
println!("t.1: {:?}", t.1);
}

3.3 引用

Rust 也提供了引用类型

Copy
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 之间的区别，前者是声明了一个可变引用，我们可以修改这个引用绑定的值；后者声明了一个指向可变变量的引用。