首先,这不是 Enums in Ruby 的副本:)
该问题的公认答案表明这是在 Ruby 中表示枚举的好方法:
class Foo
BAR = 1
BAZ = 2
BIZ = 4
end
在 Java 中,可以将多个值和方法附加到枚举值。我想在 Ruby 中实现相同或类似的目标。
什么是最像 Ruby 的方式来表示这个 Java 枚举:
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()
:
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
关于java - Ruby 中的高级类 Java 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1461286/