java - Ruby 中的高级类 Java 枚举

标签 java ruby enums

首先,这不是 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/

相关文章:

python - 如何使用 Pony ORM 存储 Python 枚举?

java - 如何避免在运行 "test"时再次运行 "install"

java - 返回null是否正确?

java - 用于执行 Azure blob 加密/解密的默认加密策略是什么

ruby 卡门 'NameError'

java - 在java中调用包含枚举的函数

postgresql - Postgres 使用字符串中的枚举更新列

Java:可以合并仅包含其他包的包的空子目录吗?

java - JRuby 到 jar 可执行文件

ruby-on-rails - 如何让 ActionController::Live streaming 与 Thin 一起工作?