Rust_Chapter_4_结构体
对于早期学习了C++的我来说,OOP是很重要的东西,因而同理Rust里的结构体也是极其重要的
结构体的定义与实例化
和元组不一样的是,结构体需要给每个数据赋予名字以便清楚地表明它们的意义。正是由于有了这些名字,结构体的使用要比元组更加灵活:你不再需要依赖顺序索引来指定或访问实例中的值。
结构体的定义
关键字struct被用来定义并命名结构体,一个良好的结构体名称应当能够反映出自身数据组合的意义。除此之外,我们还需要在随后的花括号中声明所有数据的名字及类型,这些数据也被称作字段。如下代码展示了一个用于存储账户信息的结构体定义:1
2
3
4
5
6struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
注意到这里与C++不同的语法,首先类型后置不必多言,所有类型结尾都要接上一个逗号,
,而且结构体声明的最后也不需要加上一个在C/C++中很容易忘掉的分号;
结构体的实例化
直接看代码,和C++很不一样,这里首先要加上成员变量的名字,再把Rust结构体的定义中的类型名换成具体的名字。注意到这里是一条语句,所以语句的结尾要加上分号;
1 | let user1 = User { |
在获得了结构体实例后,我们可以通过点号来访问实例中的特定字段(熟悉的语法)。
如果你想获得某个用户的电子邮件地址,那么可以使用user1.email
来获取。另外,假如这个结构体的实例是可变的(结构体的定义当然无关可不可变),那么我们还可以通过点号来修改字段中的值。示例5-3展示了如何修改一个可变User
实例中email
字段的值
1 | let mut user1 = User { |
需要注意的是,一旦实例可变,那么实例中的所有字段都将是可变的。Rust不允许我们单独声明某一部分字段的可变性。如同其他表达式一样,我们可以在函数体的最后一个表达式中构造结构体实例,来隐式地将这个实例作为结果返回。
下面这个例子中的build_user
函数会使用传入的邮箱和用户名参数构造并返回User
实例。另外两个字段active
和sign_in_count
则分别被赋予了值true和1。1
2
3
4
5
6
7
8fn build_user(email: String, username: String) -> User {
User {
email: email,
username: username,
active: true,
sign_in_count: 1,
}
}