Ruby 中的枚举
Nurudeen Ibrahim
2023年1月30日
Ruby
Ruby Enum
枚举是一种包含一组固定常量的数据类型,通常映射到整数值。与许多其他编程语言不同,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。
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe