class MyEnum attr_accessor :value def initialize(value) @value = value end
VALUE1 = new("Value 1")
VALUE2 = new("Value 2")
class << self
private :new
end
end
MyEnum::VALUE2 # Enum with value "Value 2"
MyEnum.new # Error
一个更精细的解决方案,它允许您定义任意的“枚举类”,并为您提供ordinal()
:
def enum(*values, &class_body)
Class.new( Class.new(&class_body) ) do
attr_reader :ordinal
def initialize(ordinal, *args, &blk)
super(*args, &blk)
@ordinal = ordinal
end
values.each_with_index do |(name, *parameters), i|
const_set(name, new(i, *parameters))
end
class <<self
private :new
end
end
end
# Usage:
MyEnum = enum([:VALUE1, "Value 1"], [:VALUE2, "Value 2"]) do
attr_reader :str
def initialize(str)
@str = str
end
end
MyEnum::VALUE1.str #=> "Value 1"
MyEnum::VALUE2.ordinal #=> 1