第一天:早上#
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 之間的區別,前者是聲明了一個可變引用,我們可以修改這個引用綁定的值;後者聲明了一個指向可變變量的引用。