数据类型

变量

Rust 里的变量分为可变和不可变，分别可以对标 JS 里的 let 和 const 声明。我不理解，明明都叫变量了为啥还分可不可变，白马非马？

Copy
// 声明不可变变量
let x = 1;
// 声明可变变量
let mut y = 1;

mut 是 mutable (可变的) 缩写，很多时候学语法的第一件事应该是搞明白关键字的英文含义 (对中文开发者而言), 硬背也能记住，一转头容易忘。以我浅薄的英文储备，这单词问了 chatGPT 才知道是谁的缩写，DeepL 大概是觉得这属于冷门单词，中翻英的时候没给我结果.

常量

Rust 里的常量跟 JS 没啥对标的，硬要对标可以对一下 Node.js 里的 env 环境变量，因为限制挺像的，不能用运行时求的值参与计算，一般用于全局范围.

Copy
// 此 const 非彼 const
const SOME_CONSTANT = 10 * 20;

隐藏

这特性也能单独给个定义，实际作用就是重用变量名，当然前提是被隐藏的变量在当前作用域里不再需要被访问，JS 也有这表现 (记岔了，JS 用 let 重复声明会报错), 我感觉写起来容易混淆.

Copy
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 里不返回值的表达式隐式返回单元元组.

Copy
let tup = (1, 'f', true);
let num = tup.0;
// 还能解构
let (num, str, bool) = tup;

数组

Rust 中数组和 JS 里的数组除了 [] 一样剩下的都不太一样，首先要求固定长度，其次所有成员必须是同一类型。用的话基本就是声明如十二个月份和一周七天这样可穷举的同类常量组合.

Copy
let arr = [1, 2, 3];
let first = arr[0];
let last = arr[2];

枚举

枚举 是可以列出所有可能的集合类型，Rust 中的枚举可以包含任意类型的值。也可以为枚举定义关联函数，这点我感觉极大地提升了代码灵活性.

Copy
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 的概念比较接近，是多个有关联的字段的集合.

Copy
// 定义
struct User {
name: String,
age: u8,
};

// 实例化
let user1 = User {
name: String::from("name"),
age: 18,
};