结构体简介
本课程带你了解结构体的基本知识。
什么是结构体?
结构体由相关联的项组成,这些项可能具有不同的数据类型。
结构体在这方面类似于元组。然而,与元组不同的是,你必须在结构体中为每个项明确指定数据类型。
结构体有助于创建自定义数据类型。
让我们看一个现实生活中的例子。 你知道矩形有两个测量值:宽度和高度。假设你有多个矩形,并且可以给它们命名。一旦你在结构体中声明了矩形的各个项目,就可以根据矩形的类型来初始化其值。 假设矩形的尺寸会随着颜色的不同而变化。
声明结构体
使用 struct 关键字后跟结构体名称,再用大括号包围结构体的内容来声明结构体。
在大括号内部,结构体的各个项以 键: 值 的形式定义,其中键是结构体的字段名,值是该字段的数据类型。
注意: 结构体可以在任何位置声明,无论是在使用它的函数之前还是之后都可以。
命名规范:
结构体名称应采用 帕斯卡命名法(PascalCase),即复合词中每个单词的首字母都大写。
如果未遵循此规则,编译器将发出警告 ⚠️。
初始化结构体
仅声明结构体只是定义了一个自定义数据类型的蓝图,此时并未在内存中创建实际的对象。只有当创建该类型的变量时,才会真正实例化对象。
注意: 为字段赋值时,顺序无关紧要。
访问结构体中的值
要访问结构体中的某个值,只需写出结构体名称,后接 . 操作符,再写出要访问的字段名称。
注意: 结构体实例默认是不可变的,因此无法修改,除非显式声明为可变。但其值仍然可以被访问。
更新结构体实例
通过在 let 后添加 mut 关键字来声明结构体实例为可变,即可使其变为可变。这样就可以使用点操作符访问任意字段,并更新其值。
示例
以下示例创建了一个名为 Course 的结构体,并定义了三个字段:课程名称、课程级别和课程代码。
1// 声明一个结构体 2struct Course { 3 code: i32, 4 name: String, 5 level: String, 6} 7 8fn main() { 9 // 初始化 10 let mut course1 = Course { 11 name: String::from("Rust"), 12 level: String::from("beginner"), 13 code: 130, 14 }; 15 let course2 = Course { 16 name: String::from("Javascript"), 17 level: String::from("beginner"), 18 code: 122, 19 }; 20 // 访问 21 println!("Name: {}, Level: {}, code: {}", course1.name, course1.level, course1.code); 22 println!("Name: {}, Level: {}, code: {}", course2.name, course2.level, course2.code); 23 // 更新 24 course1.name = "Java".to_string(); 25 course1.code = 134; 26 println!("Name: {}, Level: {}, code: {}", course1.name, course1.level, course1.code); 27}
说明
-
main函数从 第 8 行到第 27 行 定义了
main函数。- 第 10 行到第 14 行 创建了一个可变的
mut实例course1,类型为Course。 - 第 15 行到第 19 行 创建了一个不可变的实例
course2,类型也为Course。 - 第 21 行和第 22 行 使用点操作符打印出
course1和course2的值。 - 由于
course1是可变的,因此可以在 第 24 行和第 25 行 更新其name和code字段的值。 - 更新后的结果在 第 26 行 输出。
- 第 10 行到第 14 行 创建了一个可变的
-
struct在 第 2 行 声明了一个名为
Course的结构体。在结构体体内,定义了三个字段:code(类型为i32)、name(类型为String)、level(类型为String)。
下图解释了上述代码:
测验
测试你对结构体基础知识的理解。
现在你已经学习了 Rust 中结构体的基础知识,接下来请进入下一课:“函数与结构体”。
Quiz
结构体的值可以通过以下方式访问: