结构体

第一遍边抄示例边看文档，一天能过两大章，现在写着笔记，两天不过半章. 😔

可变性

如果想修改某个字段的值，则结构体实例必须是可变的.

结构体更新语法

结构体更新语法 有点像 JS 里的 Spread 语法，但只能用旧的实例创建同一结构体实例。这啥场景用，直接修改可变实例的字段不行吗，难道不想创建可变实例而去做合并的操作，immutability?

Copy
let user2 = User {
age: 19,
..user1
}

还有俩特殊的结构体定义

Copy
// 元组结构体
struct Color(i32, i32, i32);
// 类单元结构体
struct Something;

理解

相比元组可以为复合的值提供可读的标识。在 TS 中也有元组的概念，就是有限长度的数组，数组是 key 为数字索引的特殊对象，在一些场景里可以代替对象的使用，但指定的 key 更好理解字段的意义.

让值的集合成为一个抽象的存在，之后就可以针对这个集合实现方法和关联函数.

方法和关联函数

可以为结构体实现与之关联的 [[函数]], 称为关联函数, 类似 JS 类的静态方法。如果关联函数第一个参数通过 self 获取实例的上下文，则被称为方法.

Copy
impl User {
// 关联函数
fn new() -> Self {
Self {
name: String::from(""),
age: 1,
}
}
// 实例方法
fn get_name(&self) -> &str {
&self.name
}
// 实例可变方法
fn set_name(&mut self, name: String) {
self.name = name
}
}

定义方法时第一个参数 &self 是 self: &Self 的简写。也可以去掉 & 获取实例的所有权.