在 Rust 中,struct
是一种用于创建自定义数据类型的关键字,它允许你定义和组织数据的结构。struct
可以包含多个不同类型的字段(fields),每个字段都有一个名称和一个类型。
定义结构体
下面是一个简单的例子,展示了如何定义和使用 struct
:
// 定义一个结构体
struct Point {
x: f64,
y: f64,
}
// 使用结构体
fn main() {
// 创建 Point 结构体的实例
let origin = Point { x: 0.0, y: 0.0 };
// 访问结构体的字段
println!("X coordinate: {}", origin.x);
println!("Y coordinate: {}", origin.y);
// 创建可变的结构体实例,并修改字段的值
let mut point = Point { x: 5.0, y: 10.0 };
point.x = 7.0;
// 结构体的解构
let Point { x, y } = point;
println!("X: {}, Y: {}", x, y);
}
元组结构体(Tuple Structs):
Rust 还支持一种特殊的结构体,称为元组结构体。它们类似于元组,但有一个具体的命名。
// 元组结构体
struct Color(u8, u8, u8);
fn main() {
// 创建 Color 元组结构体的实例
let red = Color(255, 0, 0);
// 访问元组结构体的字段
println!("Red component: {}", red.0);
}
在这个例子中,Color
是一个元组结构体,有三个字段,分别表示 RGB 颜色的三个分量。通过 (255, 0, 0)
创建了一个红色的实例,并通过 .0
访问了第一个字段。
类单元结构体(Unit-like Structs):
有时候,一个结构体不包含任何字段,这种结构体被称为类单元结构体。
// 类单元结构体
struct EmptyStruct;
fn main() {
// 创建类单元结构体的实例
let empty = EmptyStruct;
// 无字段可访问
}
这是一个非常简单的例子,但有时候类单元结构体用于实现某种特定的 trait,或者作为类型标记的一部分。
可变性
如果结构体的某个字段需要被修改,需要将结构体声明为可变的。可变性在 Rust 中是默认不可变的,因此如果要修改结构体的字段,需要使用 mut
关键字。
struct MutableStruct {
value: i32,
}
impl MutableStruct {
fn modify_value(&mut self, new_value: i32) {
self.value = new_value;
}
}
fn main() {
let mut my_struct = MutableStruct { value: 42 };
my_struct.modify_value(10);
println!("Modified value: {}", my_struct.value);
}
作为函数返回值
简写初始化
更新语法
struct Point {
x: f64,
y: f64,
}
fn main() {
let p1 = Point { x: 1.0, y: 2.0 };
// 使用更新语法创建新的结构体实例
let p2 = Point { x: 3.0, ..p1 };
println!("p2.x: {}", p2.x); // 输出: 3.0
println!("p2.y: {}", p2.y); // 输出: 2.0 (来自于 p1)
}
在这个例子中,Point { x: 3.0, ..p1 }
创建了一个新的 Point
实例 p2
,其中 x
被更新为 3.0,而 y
则继承自现有实例 p1
。
方法
- 注:
#[derive(Debug)]
通过trait实现“继承”(本质是代码复用)