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
3 Réponses :
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
Selon le comportement, on veut, cela pourrait être logique de le remplacer par attr_reader code>. 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!!
Vous pouvez toujours créer un système qui ressemble à la version Java:
Ceci est mon code suggéré ...
Enummodule.rb strong> p> échantillonum.rb strong> < / p> en étendant le Enummodule code>,
hachage code> Les contenants de constantes (clé et valeur) deviennent des méthodes singleton. P> p>
Vous devez supprimer le modificateur «public» sur le constructeur pour la rendre compiler.