第一遍边抄示例边看文档,一天能过两大章,现在写着笔记,两天不过半章. 😔
可变性#
如果想修改某个字段的值,则结构体实例必须是可变的.
结构体更新语法#
结构体更新语法 有点像 JS 里的 Spread 语法,但只能用旧的实例创建同一结构体实例。这啥场景用,直接修改可变实例的字段不行吗,难道不想创建可变实例而去做合并的操作,immutability?
let user2 = User {
age: 19,
..user1
}
还有俩特殊的结构体定义
// 元组结构体
struct Color(i32, i32, i32);
// 类单元结构体
struct Something;
理解#
- 相比元组可以为复合的值提供可读的标识。在 TS 中也有元组的概念,就是有限长度的数组,数组是 key 为数字索引的特殊对象,在一些场景里可以代替对象的使用,但指定的 key 更好理解字段的意义.
- 让值的集合成为一个抽象的存在,之后就可以针对这个集合实现方法和关联函数.
方法和关联函数#
可以为结构体实现与之关联的 [[函数]], 称为关联函数, 类似 JS 类的静态方法。如果关联函数第一个参数通过 self
获取实例的上下文,则被称为方法.
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
的简写。也可以去掉 &
获取实例的所有权.