8
votes

Java Advanced Java - Enums à Ruby

Tout d'abord, ce n'est pas un duplicata de Enums in Ruby :)

Le La réponse acceptée de cette question suggère cela comme un bon moyen de représenter Enums dans Ruby: P>

Enum.VALUE_1.getValue(); // "Value 1"
Enum.VALUE_2.name();     // "VALUE_2"
Enum.VALUE_3.ordinal();  // 2


1 commentaires

Vous devez supprimer le modificateur «public» sur le constructeur pour la rendre compiler.


3 Réponses :


14
votes
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

6 commentaires

Selon le comportement, on veut, cela pourrait être logique de le remplacer par attr_reader . Cependant, je ne vois pas pourquoi on voudrait le retirer complètement parce que je m'attendais à ce que on veuille au moins être capable de lire la valeur, sinon il n'y aurait pas de point d'avoir une valeur en premier lieu.


Absolument vrai, au moins, il devrait être capable de faire: myenum :: value2.value, ou nous pouvons remplacer sur_s pour renvoyer la valeur, ce serait plus concis;)


Dans cet exemple, comment puis-je récupérer la valeur ordinale (en Java: valorisation1.Ardinale ())


Tu ne voudrais pas. Pour cela, vous devez sauvegarder le numéro sous forme de deuxième valeur ou coder une solution qui conserve un index automatiquement.


Mise à jour ma question pour être plus précise.


Merci pour votre réponse rapide!!



4
votes

Vous pouvez toujours créer un système qui ressemble à la version Java: xxx


0 commentaires

0
votes

Ceci est mon code suggéré ...

Enummodule.rb xxx

échantillonum.rb < / p> xxx

en étendant le Enummodule , hachage Les contenants de constantes (clé et valeur) deviennent des méthodes singleton.


0 commentaires