首先,这不是中Enums的重复:)
这个问题的公认答案表明,这是表示Ruby中枚举的好方法:
class Foo BAR = 1 BAZ = 2 BIZ = 4 end
在Java中,可以将多个值和方法附加到枚举值。我想在Ruby中实现相同或相似的东西。
代表此Java枚举的最类似于Ruby的方式是什么:
public enum Enum VALUE_1("Value 1"), VALUE_2("Value 2"), VALUE_3("Value 3"); Enum(String value) { this.value = value; } public String getValue() { return value; } private String value; }
编辑:
我还想保留Java枚举的隐式功能:
例子:
Enum.VALUE_1.getValue(); // "Value 1" Enum.VALUE_2.name(); // "VALUE_2" Enum.VALUE_3.ordinal(); // 2
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():
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