Rust-结构体
结构体是一种可支持我们进行自定义的数据类型,它允许我们可以把多个相关联的值进行打包,组成一个有意义的组合,并取一个新的名字。
一、结构体语法
1. 如何定义一个结构体?
- 使用struct关键字,并为整个结构体进行命名。
- 在花括号内,为所有成员字段定义名称和类型。
- 每个成员字段以逗号进行分隔,即使是最后一个成员也需要如此。
例如, 以下结构体定义了某网站的用户:
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
该结构体名称是 User,拥有 4 个字段,且每个字段都有对应的字段名及类型声明,例如 username 代表了用户名,它是 String 类型。
2. 如何使用一个结构体?
想要使用结构体,就需要先创建结构体的实例:
-
为每个字段指定具体的值,不多不少。
-
无需按照声明的顺序进行指定
let user1 = User {
email: String::from("someone@example.com"),
username: String::from("someusername123"),
active: true,
sign_in_count: 110,
};
3. 如何取得结构体里面的某个值?
通过.
操作符即可访问结构体实例内部的字段值,也可以修改它们(修改要在创建结构体实例时使用mut
):
let mut user1 = User {
email: String::from("someone@example.com"),
username: String::from("someusername123"),
active: true,
sign_in_count: 1,
};
user1.email = String::from("anotheremail@example.com"); //赋新值
注意:一旦 struct 的实例是可变的(mut
),那么实例中所有的字段都是可变的。Rust 不支持将结构体中的特定字段标记为可变而其他字段却不可变。
4. 简化结构体创建
简化结构体创建的操作用到了函数,这利用了“struct也可作为函数的返回值”的特性。
以下面的函数为例,它接收两个字符串参数: email 和 username,然后使用它们来创建一个 User 结构体,并且返回了 User 结构体的实例:
fn build_user(email:String, username:String) -> User{
User{
emali: email,
username: username,
active: true,
sign_in_count: 112,
}
}
5. 字段初始化简写
这是一个小tip,当结构体字段名与字段值对应变量名相同时,Rust支持使用字段初始化简写的方式:
fn build_user(email:String, username:String) -> User{
User{
emali,
username,
active: true,
sign_in_count: 112,
}
}
6. struct更新语法
在实际场景中,有一种情况很常见:根据已有的结构体实例,创建新的结构体实例,例如根据已有的 user1 实例来构建 user2。
当你想要基于某个现有的struct实例来创建一个新实例的时候,在这种情况下,新实例中某些字段的值可能和现有的实例是相同的,而其他的字段和现有的实例可能存在不一样的情况。
我们想要实现这个效果,会这么做:
let user1 = User {
email: String::from("someone@example.com"),
username: String::from("someusername123")