目录
[1. 结构体的定义与实例化](#1. 结构体的定义与实例化)
[1.1 结构体的基本概念](#1.1 结构体的基本概念)
[1.2 定义结构体](#1.2 定义结构体)
[1.3 创建结构体实例](#1.3 创建结构体实例)
[1.4 结构体的定义与实例化示例](#1.4 结构体的定义与实例化示例)
[2. 访问与修改结构体字段](#2. 访问与修改结构体字段)
[2.1 访问字段](#2.1 访问字段)
[2.2 修改字段](#2.2 修改字段)
[3. 结构体实例的构造函数](#3. 结构体实例的构造函数)
[3.1 构造函数的定义](#3.1 构造函数的定义)
[3.2 使用字段初始化简写](#3.2 使用字段初始化简写)
[4. 结构体更新语法](#4. 结构体更新语法)
[4.1 更新语法的使用](#4.1 更新语法的使用)
[5. 元组结构体](#5. 元组结构体)
[5.1 元组结构体的定义](#5.1 元组结构体的定义)
[6. 单元结构体](#6. 单元结构体)
[6.1 单元结构体的定义](#6.1 单元结构体的定义)
[7. 结构体数据的所有权](#7. 结构体数据的所有权)
[7.1 数据所有权的重要性](#7.1 数据所有权的重要性)
思维导图
1. 结构体的定义与实例化
1.1 结构体的基本概念
-
结构体是一种自定义数据类型,允许将多个相关的值组合在一起,形成一个有意义的集合。与元组不同,结构体的每个字段都有名称,这使得数据的访问和操作更加直观和清晰。
-
结构体的灵活性体现在其命名字段上,开发者无需依赖字段的顺序来访问数据,从而减少了错误的可能性。
1.2 定义结构体
-
使用struct关键字定义结构体,并为其命名。结构体名称应具有描述性,能够清晰地表达其代表的含义。
-
在大括号内定义字段的名称和类型。字段的类型可以是Rust中的任意数据类型,包括基本类型、复合类型或其他结构体。例如:
ruststruct User { active: bool, username: String, email: String, sign_in_count: u64, }
1.3 创建结构体实例
-
创建结构体实例时,需要为每个字段指定具体值,可以不按照定义时的顺序。例如:
rustlet user1 = User { active: true, username: String::from("someusername123"),[5] email: String::from("someone@example.com"),[5][6] sign_in_count: 1, };
1.4 结构体的定义与实例化示例
rust
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
fn main() {
// 创建结构体实例
let user1 = User {
active: true,
username: String::from("someusername123"),
email: String::from("someone@example.com"),
sign_in_count: 1,
};
// 访问字段
println!("User1: {}, {}, ({}), {}",
user1.active, user1.username, user1.email, user1.sign_in_count);
}
2. 访问与修改结构体字段
2.1 访问字段
- 使用点表示法(.)访问结构体实例的字段。例如,user1.email可以获取用户的电子邮件地址。
2.2 修改字段
-
如果结构体实例是可变的(即使用mut关键字声明),可以通过点表示法修改字段的值。例如:
ruststruct User { active: bool, username: String, email: String, sign_in_count: u64, } fn main() { // 创建可变结构体实例 let mut user1 = User { active: true, username: String::from("someusername123"), email: String::from("someone@example.com"), sign_in_count: 1, }; //修改字段 user1.email = String::from("anotheremail@example.com"); // 访问字段 println!("updated User1: {}, {}, ({}), {}", user1.active, user1.username, user1.email, user1.sign_in_count); }
3. 结构体实例的构造函数
3.1 构造函数的定义
-
可以定义一个函数来返回结构体实例,这种函数通常称为构造函数。例如,以下build_user函数用于创建User实例:
ruststruct User { active: bool, username: String, email: String, sign_in_count: u64, } fn main() { // 定义构造函数 fn build_user(email: String, username: String) -> User { User { active: true, username, email, sign_in_count: 1, } } // 使用构造函数创建实例 let user1 = build_user( String::from("someone@example.com"), String::from("someusername123"), ); // 访问字段 println!("User1: {}, {}, ({}), {}", user1.active, user1.username, user1.email, user1.sign_in_count); }
3.2 使用字段初始化简写
- 当函数参数与结构体字段同名时,可以使用字段初始化简写语法,避免重复代码。例如,username: username可以简写为username。
4. 结构体更新语法
4.1 更新语法的使用
-
结构体更新语法允许基于现有实例创建新实例,同时仅修改部分字段。例如:
rustlet user2 = User { email: String::from("another@example.com"),[5] ..user1 };
-
在上述代码中,user2继承了user1的所有字段值,但email字段被更新为新值。
5. 元组结构体
5.1 元组结构体的定义
-
元组结构体 是一种特殊的结构体,它没有命名字段,仅有字段类型。元组结构体适用于需要为整个元组命名的场景。例如:
ruststruct Color(i32, i32, i32);[10] struct Point(i32, i32, i32);[10]
-
元组结构体的实例可以通过索引访问字段,例如let black = Color(0, 0, 0);。
6. 单元结构体
6.1 单元结构体的定义
-
单元结构体 是一种没有字段的结构体,类似于单元类型()。它通常用于实现某些特征(trait)而不需要存储数据。例如:
ruststruct AlwaysEqual; fn main() { let subject = AlwaysEqual; }
7. 结构体数据的所有权
7.1 数据所有权的重要性
-
在结构体中使用拥有所有权的类型(如
String
)而非引用类型(如&str
),可以确保每个结构体实例拥有其数据的所有权,从而避免生命周期管理的复杂性。 -
如果需要在结构体中使用引用类型,则必须显式指定生命周期参数,以确保引用的有效性。这将在后续章节中详细讨论。