结构体 (Structs)
结构体(Struct)是 Flurry 中最基本的用户自定义数据类型之一。它允许你将多个不同类型的值组合在一起,形成一个有意义的、命名的复合类型。
定义结构体
使用 struct
关键字来定义结构体,并在花括号 {}
内声明其字段(成员变量)。每个字段都有一个名称和一个类型注解。
struct Point {
x: f64,
y: f64,
}
struct Color {
red: u8,
green: u8,
blue: u8,
}
struct UserProfile {
username: String,
email: String,
is_active: bool,
login_count: u64,
}
实例化结构体
定义了结构体后,你可以创建它的实例。Flurry 使用类似 TypeName { .field1 value1, ... }
的语法来初始化结构体实例,这正是我们之前讨论过的 "双变参调用" 语法的一种应用,这里没有传递 "children",只传递了 "attributes"(字段)。
let origin = Point { .x 0.0, .y 0.0 }
let white = Color { .red 255, .green 255, .blue 255 }
let user = UserProfile {
.username "alice".to_string(),
.email "alice@example.com".to_string(),
.is_active true,
.login_count 5,
}
字段初始化的顺序通常不重要,但必须提供所有非可选字段的值(除非它们有默认值,这需要语言支持)。
访问字段
使用点 (.
) 操作符来访问结构体实例的字段。
println("Origin point: ({}, {})", origin.x, origin.y); -- 输出: Origin point: (0.0, 0.0)
let user_email = user.email;
如果字段是可变的 (mut
),且实例绑定也是可变的 (let ...
),则可以修改字段的值:
let user = user;
user.login_count += 1;
结构体作为命名空间
如前所述,struct
定义本身就是一个命名空间。你可以在 struct
定义的花括号内直接定义关联函数(通常称为方法)。方法通常接收 *self
(指针), 或 self
(获取所有权) 作为第一个参数,用于访问或修改实例数据。
struct Rectangle {
width: u32,
height: u32,
pub fn area(*self) -> u32 {
self.width * self.height -- 通过 self 访问实例字段
}
pub fn square(size: u32) -> Self { -- Self 是类型的别名
Rectangle { .width size, .height size }
}
}
test {
let rect = Rectangle { .width 10, .height 5 }
println("Area: {}", rect.area()); -- 调用实例方法: 输出 Area: 50
let sq = Rectangle.square(8);
println("Square area: {}", sq.area()); -- 输出 Square area: 64
}
- 方法定义在
struct { ... }
内部。 - 使用
.
操作符调用实例方法 (rect.area()
)。 - 使用
.
调用选取符号 (Rectangle.square(8)
)。
组合与委托 (using
)
结构体可以通过 using
关键字将内部字段的成员暴露出来,简化接口。
struct Person {
name: String,
pub fn greet(*self) { println("Hello, I'm {}", self.name); }
}
struct Employee {
person: Person,
employee_id: u32,
using person.*; -- 将 Person 的 greet 方法提升到 Employee
}
test {
let emp = Employee {
.person Person { .name "Bob".to_string() },
.employee_id 123,
}
emp.greet(); -- 直接调用 greet,无需 emp.person.greet()
-- 输出: Hello, I'm Bob
}
结构体是 Flurry 中构建复杂数据模型的核心工具,结合其作为命名空间的能力和属性系统,提供了强大的定制化和组织能力。