Ruby 中的枚举

Nurudeen Ibrahim 2023年1月30日
  1. 在 Ruby 中使用模块实现枚举
  2. 在 Ruby 中使用 Hash 实现枚举
  3. Rails 中使用 Ruby 的枚举
Ruby 中的枚举

枚举是一种包含一组固定常量的数据类型,通常映射到整数值。与许多其他编程语言不同,Ruby 没有内置的 Enum 类型。

尽管 Enums 功能是在 Rails 4.1 中使用一些自定义实现引入的。

在 Ruby 中使用模块实现枚举

我们将有一个名为 Status 的枚举,其中包含预定义值集 PENDINGIN_PROGRESSCOMPLETE

module Status
  PENDING = 1
  IN_PROGRESS = 2
  COMPLETE = 3
end

puts Status::PENDING
puts Status::IN_PROGRESS
puts Status::COMPLETE

输出:

1
2
3

这三个元素中的每一个都映射到一个整数值,因此无论我们看到 1 的状态,这意味着我们指的是 PENDING 状态,而 2 和 3 指的是 IN_PROGRESSCOMPLETE

只有当我们想在代码的不同区域引用枚举值时,这种设计才有用。

在 Ruby 中使用 Hash 实现枚举

STATUS = {
  pending: 1,
  in_progress: 2,
  complete: 3
}

def status_string(value)
  STATUS.key(value)
end

puts STATUS[:pending]
puts status_string(2)

输出:

1
in_progress

上面的设计允许你访问状态值和状态元素(类型)。如果枚举映射到状态字段,这很有用。

Rails 中使用 Ruby 的枚举

Rails 4.1 引入了枚举的概念,当你有一个像上面描述的 status 这样的复杂值需要存储在数据库中时,它会派上用场。

例如,一个 Project 模型可以有一个可以是枚举的状态字段,我们将其定义如下所示。

## Project model
class Project
  ##
  enum status: {
    pending: 1,
    in_progress: 2,
    complete: 3
  }
end

数据库中的状态字段定义为整数字段。对于 pending 状态项目,存储 1in_progress 存储 2,存储 completed 项目 3

Rails 会根据我们的状态示例在后台自动创建一些方法,使使用枚举字段变得容易。

Rails 会自动创建以下有用的方法。

  • statusproject.status 返回项目的状态。
  • pending?project.pending? 如果项目未决,则返回 true,否则返回 false。
  • in_progress?project.in_progress? 如果项目正在进行,则返回 true,否则返回 false。
  • complete?project.complete? 如果项目完成则返回 true,否则返回 false。
  • pending!project.pending!将项目的状态更新为 pending
  • in_progress!project.in_progress!将项目的状态更新为 in_progress
  • complete!project.complete!将项目的状态更新为 complete