class MyEnum
attr_accessor :value
def initialize(value)
@value = value
end
VALUE1 = new("Value 1") VALUE2 = new("Value 2") class << self private :new endendMyEnum::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 endend# Usage:MyEnum = enum([:VALUE1, "Value 1"], [:VALUE2, "Value 2"]) do attr_reader :str def initialize(str) @str = str endendMyEnum::VALUE1.str #=> "Value 1"MyEnum::VALUE2.ordinal #=> 1



