第一天:早上#
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) , … |
数组的赋值和访问: |
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
之间的区别,前者是声明了一个可变引用,我们可以修改这个引用绑定的值;后者声明了一个指向可变变量的引用。