跳转到内容

Rust 入门编程/枚举

100% developed
来自维基教科书,开放的书籍,构建开放的世界

假设我们正在存储构成一个角的三个点,并且我们希望在一个结构体中跟踪有关它的某些属性。 我们想在结构体中跟踪哪些属性? 好吧,我们可以存储三个点的 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 的一个重要特点是,有时它鼓励非常清晰地写出事物,即使这样写起来需要更长的时间。 这是由于一些编程规则

  1. 代码被阅读的次数比被编写的次数更多
  2. 代码比阅读更容易编写
  3. 更短的类型和变量名称通常不像更长的名称那样全面地解释事物

所有这些意味着从长远来看,在编写代码时花时间可以节省以后的时间。

现在我们可以使用普通的 == 运算符检查枚举是否是我们期望的类型。 例如:

 fn is_angle_right(points: Points) -> bool {
     points.angle_type == AngleType::Right
 }

等等,返回语句在哪里? 为什么它没有以分号结尾? 好吧,因为我们通常希望拥有简短的函数,如果我们使用隐式返回,就可以节省时间,在隐式返回中,我们省略分号,以便语句自动返回。 正常的规则适用,因此语句的类型必须与函数的返回类型匹配。 这很有用,但也可能难以理解,因此在您认为有意义的地方使用它。

关于 Rust 枚举的另一个优点是,由于不同的状态可能与不同的数据相关联,因此我们可以在这些类型中存储数据。 例如,假设我们想添加一个布尔值,以表示该角度是否与轴线对齐。 这只有对于直角才有意义,因此我们可以像这样添加该布尔值

 enum AngleType {
     Acute,
     Right(bool),
     Obtuse,
     Reflex,
 }

但是我们如何从枚举中获取值? 这就是模式匹配的作用

下一步:模式匹配

华夏公益教科书