Rust编程指南:结构体的定义与使用详解
trpl-zh-cn Rust 程序设计语言(2021 edition 施工中) 项目地址: https://gitcode.com/gh_mirrors/tr/trpl-zh-cn
什么是结构体
结构体(struct)是Rust中一种自定义数据类型,它允许你将多个相关值组合在一起,形成一个有意义的组合。结构体中的每个数据片段称为字段(field),每个字段都有自己的名称和类型。
结构体的基本定义
定义一个结构体需要使用struct
关键字,后跟结构体名称和大括号包裹的字段列表:
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
这个User
结构体有四个字段:
username
和email
是String类型sign_in_count
是无符号64位整数active
是布尔值
结构体实例化
创建结构体实例需要为每个字段指定具体值:
let user1 = User {
email: String::from("someone@example.com"),
username: String::from("someusername123"),
active: true,
sign_in_count: 1,
};
注意:
- 字段顺序不必与定义时一致
- 必须为所有字段赋值
- 实例默认是不可变的,如需修改需声明为可变
访问和修改结构体字段
使用点号(.)访问结构体字段:
println!("User email: {}", user1.email);
对于可变实例,可以修改字段值:
let mut user1 = User { /* ... */ };
user1.email = String::from("newemail@example.com");
结构体的实用特性
1. 字段初始化简写
当变量名与字段名相同时,可以简化初始化:
fn build_user(email: String, username: String) -> User {
User {
email, // 等同于 email: email
username, // 等同于 username: username
active: true,
sign_in_count: 1,
}
}
2. 结构体更新语法
基于已有实例创建新实例时,可以使用..
语法:
let user2 = User {
email: String::from("another@example.com"),
..user1
};
这表示user2
除email
外,其他字段值与user1
相同。
注意:这种语法会移动数据,可能导致原实例部分或全部失效。
特殊结构体类型
1. 元组结构体
元组结构体没有命名字段,只有字段类型:
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
特点:
- 提供类型安全性(不同元组结构体是不同类型)
- 可以通过索引访问字段(如
black.0
) - 可以解构(
let Color(r, g, b) = black;
)
2. 类单元结构体
没有任何字段的结构体,类似于unit类型()
:
struct AlwaysEqual;
let subject = AlwaysEqual;
主要用于实现trait而不需要存储数据的情况。
结构体数据所有权
结构体可以:
- 拥有自己的数据(使用String等拥有所有权的类型)
- 借用数据(使用引用,但需要生命周期标注)
初学者建议先使用拥有所有权的类型,避免复杂的生命周期问题。
实际应用建议
- 使用结构体组织相关数据,提高代码可读性
- 合理使用字段初始化简写和更新语法减少重复代码
- 根据需求选择普通结构体、元组结构体或类单元结构体
- 注意可变性和所有权规则,避免意外移动数据
结构体是Rust中构建复杂数据类型的基础,合理使用可以使代码更加清晰和易于维护。
trpl-zh-cn Rust 程序设计语言(2021 edition 施工中) 项目地址: https://gitcode.com/gh_mirrors/tr/trpl-zh-cn
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考