Rust 结构体:struct 定义与方法
1. 定义基础结构体
结构体是 Rust 中组织相关数据的核心方式。它允许你将不同类型的数据组合成一个自定义的数据类型。
- 打开 你的 Rust 项目,定位到
main.rs文件。 - 使用 关键字
struct开始定义,后跟结构体的名称。名称应遵循大驼峰命名法(PascalCase)。 - 输入 一对花括号
{},在内部定义字段。 - 声明 每一个字段的名称和具体类型,中间使用冒号
:分隔,字段之间使用逗号,结尾。
以下是一个定义“矩形”结构体的代码示例:
struct Rectangle {
width: u32,
height: u32,
}
fn main() {
println!("定义成功!");
}
2. 实例化与访问字段
定义好结构体后,你需要创建其实例并操作其中的数据。
- 创建 一个实例,声明 结构体名称,后跟花括号
{}。 - 填入
键: 值对。键必须是结构体中定义的字段名,值的类型必须与字段定义的类型一致。 - 使用
let关键字将实例绑定到变量上。如果后续需要修改字段值,必须添加mut关键字。 - 获取 字段值,输入 实例名称,后面跟着一个点
.和字段名。
以下是实例化并访问字段的代码:
fn main() {
// 创建可变实例
let mut rect1 = Rectangle {
width: 30,
height: 50,
};
// 访问字段
println!("矩形的宽度是: {}", rect1.width);
// 修改字段
rect1.width = 40;
println!("修改后的宽度是: {}", rect1.width);
}
当变量名与字段名相同时,可以利用字段初始化简写语法。例如:
fn build_rectangle(width: u32, height: u32) -> Rectangle {
Rectangle {
width, // 等同于 width: width
height, // 等同于 height: height
}
}
3. 定义结构体方法
方法与函数类似,但它们是在结构体的上下文中定义的,并且它们的第一个参数总是 self,用于表示调用该方法的结构体实例。
- 编写
impl块(implementation block),格式为impl 结构体名 { ... }。 - 在
impl块内部,定义一个函数。 - 添加
&self作为第一个参数。这表示该方法借用结构体实例的不可变引用。如果你需要修改实例,则使用&mut self;如果需要获取所有权,则使用self。 - 使用 方法调用运算符
.来调用定义的方法。
以下是计算矩形面积的方法示例:
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}
fn main() {
let rect1 = Rectangle { width: 30, height: 50 };
println!("矩形的面积是: {} 平方像素", rect1.area());
}
4. 使用关联函数
关联函数通常用于构造器,它们不接收 self 参数。它们不是在实例上调用,而是在结构体本身上调用。
- 进入 结构体的
impl块。 - 定义 一个不包含
self参数的函数。 - 使用 双冒号语法
::调用关联函数。
以下是一个创建正方形关联函数的示例:
impl Rectangle {
// 这是一个关联函数,常被用作构造函数
fn square(size: u32) -> Self {
Self {
width: size,
height: size,
}
}
}
fn main() {
let sq = Rectangle::square(20);
println!("正方形边长: {}", sq.width);
}
同一个结构体的多个 impl 块是合法的,这在代码组织时非常有用,例如将普通方法与特征实现分开。
5. self 参数速查表
理解 self 的不同形式决定了方法对实例的操作权限。
| self 形式 | 所有权状态 | 适用场景 |
|---|---|---|
self |
获取所有权 | 旨在消耗转化实例,使其在调用后不再可用。 |
&self |
不可变借用 | 旨在读取实例数据,不修改它(最常用)。 |
&mut self |
可变借用 | 旨在修改实例的内部状态。 |

暂无评论,快来抢沙发吧!