Rust 入门编程/枚举
假设我们正在存储构成一个角的三个点,并且我们希望在一个结构体中跟踪有关它的某些属性。 我们想在结构体中跟踪哪些属性? 好吧,我们可以存储三个点的 x 和 y 位置,它们之间的角度。 假设我们还想存储它是哪种类型的角度。 提醒一下:锐角小于 90 度,直角正好是 90 度,钝角大于 90 度但小于 180 度,而反角大于 180 度。 如何存储这些不同的状态? 一个简单的方法可能是为每个状态分配一个数字。 例如,0 是锐角,1 是直角,2 是钝角,3 是反角。 让我们看看它是如何工作的
struct Points {
point1: (f64, f64),
point2: (f64, f64),
point3: (f64, f64),
angle: f64,
angle_type: u8,
}
现在我们必须记住哪个数字对应于哪种角度类型。 此外,还可能数字被设置为无效的角度类型,而类型系统的意义在于确保值只能是那些有意义且有效的。 这在目的上失败了。 这就是枚举的其中一个原因!
枚举(枚举类型的简称)是一种表示某事物可能处于多个不同状态中的其中一种的方式。 例如,一个玩家角色可能处于空闲、奔跑或跳跃状态。 一张图片可能处于动画或静态状态。 等等。 在这里,我们定义枚举如下
enum AngleType {
Acute,
Right,
Obtuse,
Reflex,
}
现在,我们可以将其放入我们的结构体中,如下所示
struct Points {
point1: (f64, f64),
point2: (f64, f64),
point3: (f64, f64),
angle: f64,
angle_type: AngleType,
}
我们这样使用它
fn main() {
let points = Points {
point1: (1.0, 2.0),
point2: (1.0, 1.0),
point3: (2.0, 1.0),
angle: 90.0,
angle_type: AngleType::Right,
};
}
请注意,我们必须非常详细地写出来,明确地表示它是 AngleType 类型的 Right。 Rust 的一个重要特点是,有时它鼓励非常清晰地写出事物,即使这样写起来需要更长的时间。 这是由于一些编程规则
- 代码被阅读的次数比被编写的次数更多
- 代码比阅读更容易编写
- 更短的类型和变量名称通常不像更长的名称那样全面地解释事物
所有这些意味着从长远来看,在编写代码时花时间可以节省以后的时间。
现在我们可以使用普通的 == 运算符检查枚举是否是我们期望的类型。 例如:
fn is_angle_right(points: Points) -> bool {
points.angle_type == AngleType::Right
}
等等,返回语句在哪里? 为什么它没有以分号结尾? 好吧,因为我们通常希望拥有简短的函数,如果我们使用隐式返回,就可以节省时间,在隐式返回中,我们省略分号,以便语句自动返回。 正常的规则适用,因此语句的类型必须与函数的返回类型匹配。 这很有用,但也可能难以理解,因此在您认为有意义的地方使用它。
关于 Rust 枚举的另一个优点是,由于不同的状态可能与不同的数据相关联,因此我们可以在这些类型中存储数据。 例如,假设我们想添加一个布尔值,以表示该角度是否与轴线对齐。 这只有对于直角才有意义,因此我们可以像这样添加该布尔值
enum AngleType {
Acute,
Right(bool),
Obtuse,
Reflex,
}
但是我们如何从枚举中获取值? 这就是模式匹配的作用