4.1 定义和使用结构体
听
结构体(struct)是 Rust 中用于将多个相关数据字段组合成一个自定义类型的机制。它类似于其他语言中的“记录”或“对象”,但不包含方法(方法通过独立的 impl 块实现,将在下一节介绍)。结构体使得程序能够以更清晰、类型安全的方式建模现实世界中的实体。
定义结构体
使用 struct 关键字定义结构体,并列出其字段名称和类型。例如,定义一个表示二维点的结构体:
struct Point {
x: i32,
y: i32,
}
每个字段都有明确的类型,这有助于编译器在编译期进行检查,防止类型错误。
创建结构体实例
要创建结构体的实例,需为每个字段提供值:
let p = Point { x: 0, y: 5 };
字段顺序无关紧要,但必须全部指定(除非使用更新语法,见下文)。
访问字段
通过点号(.)访问结构体的字段:
println!("x: {}, y: {}", p.x, p.y);
如果结构体实例是可变的(使用 mut 声明),则可以修改其字段:
let mut p = Point { x: 0, y: 5 };
p.x = 10;
注意:Rust 不允许仅将结构体的某个字段标记为可变,整个实例要么完全不可变,要么所有字段都可变。
元组结构体
Rust 还支持元组结构体(tuple struct),它具有结构体的语义但使用类似元组的语法:
struct Color(i32, i32, i32);
struct Point2D(i32, i32);
let black = Color(0, 0, 0);
let origin = Point2D(0, 0);
元组结构体常用于需要区分不同类型但内部结构相似的场景(例如,Color 和 Point2D 虽然都是三个整数,但语义不同,不能互相赋值)。
结构体更新语法
当创建一个新结构体实例时,如果大部分字段与另一个实例相同,可以使用更新语法复用部分字段:
let p1 = Point { x: 1, y: 2 };
let p2 = Point { x: 3, ..p1 }; // p2.x = 3, p2.y = p1.y = 2
..p1 表示“其余字段从 p1 中复制”。
所有权与结构体
结构体可以包含拥有所有权的类型,如 String:
struct User {
name: String,
email: String,
age: u32,
}
let user = User {
name: String::from("Alice"),
email: String::from("[email protected]"),
age: 30,
};
当结构体实例被移动时,其所有字段也会随之移动,遵循 Rust 的所有权规则。
小结
结构体是组织复杂数据的基本工具。通过命名字段,它提高了代码的可读性和安全性;通过值语义和所有权模型,它确保了内存安全。掌握结构体的定义与使用,是构建更大型 Rust 程序的第一步。在下一节中,我们将为结构体添加行为——通过方法和关联函数。
#Rust 入门教程
分享于 1 周前
上一篇:第四章:结构体与枚举
下一篇:4.2 方法与关联函数