Lv777

Lv777

github
twitter
jike
playstation
xiaoyuzhou

结构体

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

可变性#

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

结构体更新语法#

结构体更新语法 有点像 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
	}
}

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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。