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