今天学习的内容是 Rust 中的结构体类型。
结构体是一种用户自定义的数据类型,它是多种不同数据类型的组合。
结构体类型使用关键字 struct
声明,有三种类型的结构体:
- 无字段的单元结构
- 元组结构
- 经典的 C 结构
结构体类型的命名采用大驼峰命名规则,下面看具体的介绍。
单元结构体(unit struct )
这种结构体类型没有字段定义,使用关键字 struct
进行声明,随后是其名称,并用分号作为结尾。比如:
struct Unit;
fn main() {
let unit = Unit;
}
这种结构体类型用的非常少。
元组结构体(tuple struct )
同样使用 struct 进行声明,后面跟类型名称,最后使用元组类型来定义结构体内容。比如:
struct Color(i32, i32, i32);
虽然没有显式的为结构体中的每个字段命名,但是一个元组结构体类型是具有明确的类型名称的。比如这个例子就声明了 Color 类型的元组结构体。
初始化一个元组结构体:
let color = Color(255, 255, 255);
元组结构体的访问,和元组类型一样,可以使用 .
语法,可以使用索引,可以使用模式匹配,比如:
println!("{}", color.0); // 255
类 C 结构体
使用 struct
声明,后面跟着结构体类型的名称,再后面使用一对大括号来声明该类型有哪些字段。比如声明一个 User 类型的结构体:
struct User {
name: String,
age: u32,
}
结构体中的每个字段使用 ,
进行分隔,最后一个字段可以省略。
初始化一个 User 结构体实例:
let user = User {
name: String::from('kw'),
age: 18
}
访问结构体中的字段可以使用 .
运算符和模式匹配:
println!("名字:{}, 年龄:{}", user.name, user.age); // 名字:kw, 年龄:18
JSer 可以发现,这种类 C 结构体,非常像是 JS 中的普通对象。其实它们两者的意义也非常一致,就是能自定义更加复杂的数据类型,来应对更复杂的类型结构。
在 Rust 中,使用两个点 ..
来实现快速复用一个现成的结构体实例:
struct User {
name: String,
age: u32,
}
fn main() {
let user1 = User {
name: String::from("user1"),
age: 18,
};
let user2 = User {
name: String::from("user2"),
..user
};
println!("名字:{}, 年龄:{}", user2.name, user2.age);
}
打印的结果是 名字:user2, 年龄:18
,说明 user2
的 name
是初始化时设置的值,并复用了 user1
的 age
字段的值。
小结
Rust 中的结构体类型, 包括三类:单元结构体,元组结构体和类 C 结构体,其中类 C 结构体是使用最广泛的一种结构体类型。