變數#
Rust 中的變數分為可變和不可變,分別可以對應 JS 中的 let
和 const
声明。我不理解,明明都叫變數了為啥還分可不可變,白馬非馬?
// 声明不可变变量
let x = 1;
// 声明可变变量
let mut y = 1;
mut
是 mutable (可變的) 縮寫,很多時候學語法的第一件事應該是搞明白關鍵字的英文含義 (對中文開發者而言),硬背也能記住,一轉頭容易忘。以我淺薄的英文儲備,這單詞問了 chatGPT 才知道是誰的縮寫,DeepL 大概是覺得這屬於冷門單詞,中翻英的時候沒給我結果。
常量#
Rust 中的常量跟 JS 沒啥對應的,硬要對應可以對一下 Node.js 中的 env 環境變量,因為限制挺像的,不能用運行時求的值參與計算,一般用於全局範圍。
// 此 const 非彼 const
const SOME_CONSTANT = 10 * 20;
隱藏#
這特性也能單獨給個定義,實際作用就是重用變量名,當然前提是被隱藏的變量在當前作用域裡不再需要被訪問,JS 也有這表現 (記岔了,JS 用 let
重複聲明會報錯),我感覺寫起來容易混淆。
let x = 1;
// 這片訪問 x 是 1
{
// 這片訪問 x 還是 1
let x = x + 1;
// 這片訪問 x 是 2,想訪問前面那個是 1 的 x 就沒辦法了
}
// 這片出了👆作用域,訪問 x 又是 1 了
注意這不是賦值行為,而是新聲明了一個變量,只不過變量名一樣而已。
標量#
標量 類似於 JS 中的原始類型,也就是單獨的值,相對的是複合概念。
四種基本標量:整型、浮點、布爾和字符。這些概念不用多說,要注意的是作為標量描述的字符指 char
類型,代表的是一個 Unicode 值,簡單來說就是一個字母 / 空白字符 / 中文單字 /emoji 等,另外有個反我認知的點,整數的加減乘除會對結果捨小數位取整。
複合#
元組#
元組 可以組合多個不同類型的值,常用於函數返回值。成員數量為 0 的元組被稱為單元元組 (?? 這不叫零元),類似 JS 中的 void
。Rust 中不返回值的表達式隱式返回單元元組。
let tup = (1, 'f', true);
let num = tup.0;
// 還能解構
let (num, str, bool) = tup;
數組#
Rust 中數組和 JS 中的數組除了 []
一樣剩下的都不太一樣,首先要求固定長度,其次所有成員必須是同一類型。用的話基本就是聲明如十二個月份和一周七天這樣可窮舉的同類常量組合。
let arr = [1, 2, 3];
let first = arr[0];
let last = arr[2];
枚舉#
枚舉 是可以列出所有可能的集合類型,Rust 中的枚舉可以包含任意類型的值。也可以為枚舉定義關聯函數,這點我感覺極大地提升了代碼靈活性。
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
impl Message {
fn call(&self) {}
}
let move = Message::Move { x: 1,y: 2 }
move.call()
[[結構體]]#
結構體 和類 class
的概念比較接近,是多個有關聯的字段的集合。
// 定義
struct User {
name: String,
age: u8,
};
// 實例化
let user1 = User {
name: String::from("name"),
age: 18,
};