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