如何在Ruby中使用C风格的枚举?

如何在Ruby中使用C风格的枚举?,ruby,enumeration,language-construct,Ruby,Enumeration,Language Construct,我只是想知道在Ruby中模拟C风格枚举的最佳方法。我认为Ruby不支持真正的枚举——尽管仍然有可用的解决方案 在ruby中定义枚举的最简单方法是使用带有常量变量的类 class WindowState Open = 1 Closed = 2 Max = 3 Min = 4 end 这不太一样,但我经常会为这类事情构建一个哈希: STATES = {:open => 1, :closed => 2, :max => 3, :min => 4}.freeze

我只是想知道在Ruby中模拟C风格枚举的最佳方法。

我认为Ruby不支持真正的枚举——尽管仍然有可用的解决方案


在ruby中定义枚举的最简单方法是使用带有常量变量的类

class WindowState
  Open = 1
  Closed = 2
  Max = 3
  Min = 4
end

这不太一样,但我经常会为这类事情构建一个哈希:

STATES = {:open => 1, :closed => 2, :max => 3, :min => 4}.freeze()
冻结散列可以防止我意外修改它的内容

此外,如果您想在访问不存在的内容时引发错误,可以使用defualt Proc执行此操作:

STATES = Hash.new { |hash, key| raise NameError, "#{key} is not allowed" }
STATES.merge!({:open => 1, :closed => 2, :max => 3, :min => 4}).freeze()

STATES[:other] # raises NameError

像其他人说的那样创建一个类或散列将起作用。然而,Ruby要做的事情是使用。Ruby中的符号以冒号开头,如下所示:

greetingtype = :hello
WINDOW_STATES = { :minimized => 0, :maximized => 100 }.freeze
它们有点像只包含名称的对象


具体来说,我希望能够针对给定变量的值集执行逻辑测试。例如窗口的状态:“最小化、最大化、关闭、打开”

如果需要将枚举映射到值(例如,需要最小化到等于0,最大化到等于100等),我会使用符号散列来映射值,如下所示:

greetingtype = :hello
WINDOW_STATES = { :minimized => 0, :maximized => 100 }.freeze
冻结(就像内特说的)阻止你在将来意外地破坏东西。 通过这样做,您可以检查某些内容是否有效

WINDOW_STATES.keys.include?(window_state)
或者,如果您不需要任何值,只需要检查“成员资格”,则可以使用数组

WINDOW_STATES = [:minimized, :maximized].freeze
像这样使用它

WINDOW_STATES.include?(window_state)
如果您的密钥是字符串(例如RoR应用程序中的“状态”字段),那么您可以使用字符串数组。在我们的许多rails应用程序中,我总是这样做

WINDOW_STATES = %w(minimized maximized open closed).freeze
这正是rails
验证程序的目的:-)

个人说明: 我不喜欢打字,包括?一直以来,我都有这样一个问题(它之所以复杂是因为。在?(1,2,3)的情况下:

这可以让你打字

window_state.in? WINDOW_STATES

您在寻找哪些特定功能?您可以在数组中放置一些符号……具体来说,我希望能够针对给定变量的值集执行逻辑测试。例如窗口的状态:“最小化、最大化、关闭、打开”。注意:向对象添加实例方法可能会很危险——这有点像向全局命名空间添加内容。在处理对象时要非常小心。