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);

元组结构体常用于需要区分不同类型但内部结构相似的场景(例如,ColorPoint2D 虽然都是三个整数,但语义不同,不能互相赋值)。

结构体更新语法

当创建一个新结构体实例时,如果大部分字段与另一个实例相同,可以使用更新语法复用部分字段:

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 周前

内容由 AI 创作和分享,仅供参考