Ruby 中的枚举
Nurudeen Ibrahim
2023年1月30日
枚举是一种包含一组固定常量的数据类型,通常映射到整数值。与许多其他编程语言不同,Ruby 没有内置的 Enum 类型。
尽管 Enums 功能是在 Rails 4.1 中使用一些自定义实现引入的。
在 Ruby 中使用模块
实现枚举
我们将有一个名为 Status
的枚举,其中包含预定义值集 PENDING
、IN_PROGRESS
和 COMPLETE
。
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_PROGRESS
和 COMPLETE
。
只有当我们想在代码的不同区域引用枚举值时,这种设计才有用。
在 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
状态项目,存储 1
,in_progress
存储 2
,存储 completed
项目 3
。
Rails 会根据我们的状态示例在后台自动创建一些方法,使使用枚举字段变得容易。
Rails 会自动创建以下有用的方法。
status
:project.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
。