373 Stimmen

Wie implementiert man Enums in Ruby?

Was ist der beste Weg, um die enum Idiom in Ruby zu implementieren? Ich bin auf der Suche nach etwas, das ich (fast) wie die Java/C# enums verwenden können.

2voto

jjk Punkte 526

Dies scheint etwas überflüssig zu sein, aber ich habe diese Methode schon ein paar Mal angewandt, vor allem bei der Integration von XML oder ähnlichem.

#model
class Profession
  def self.pro_enum
    {:BAKER => 0, 
     :MANAGER => 1, 
     :FIREMAN => 2, 
     :DEV => 3, 
     :VAL => ["BAKER", "MANAGER", "FIREMAN", "DEV"]
    }
  end
end

Profession.pro_enum[:DEV]      #=>3
Profession.pro_enum[:VAL][1]   #=>MANAGER

Dies gibt mir die Strenge eines c# enum und es ist an das Modell gebunden.

2voto

Hossein Punkte 390
module Status
  BAD  = 13
  GOOD = 24

  def self.to_str(status)
    for sym in self.constants
      if self.const_get(sym) == status
        return sym.to_s
      end
    end
  end

end

mystatus = Status::GOOD

puts Status::to_str(mystatus)

Ausgabe:

GOOD

2voto

Jonke Punkte 6455

Symbole sind der Weg des Rubins. Allerdings muss man manchmal mit C-Code oder Java sprechen, die einige enum für verschiedene Dinge freilegen.


#server_roles.rb
module EnumLike

  def EnumLike.server_role
    server_Symb=[ :SERVER_CLOUD, :SERVER_DESKTOP, :SERVER_WORKSTATION]
    server_Enum=Hash.new
    i=0
    server_Symb.each{ |e| server_Enum[e]=i; i +=1}
    return server_Symb,server_Enum
  end

end

Diese kann dann wie folgt verwendet werden


require 'server_roles'

sSymb, sEnum =EnumLike.server_role()

foreignvec[sEnum[:SERVER_WORKSTATION]]=8

Dies kann natürlich abstrahiert werden und Sie können unsere eigene Enum-Klasse erstellen

1voto

Jan Krüger Punkte 16877

Die meisten Menschen verwenden Symbole (das ist die :foo_bar Syntax). Sie sind eine Art einzigartige undurchsichtige Werte. Symbole gehören nicht zu einem Enum-Typ, so dass sie nicht wirklich eine getreue Darstellung des Enum-Typs von C sind, aber das ist so ziemlich das Beste, was es gibt.

1voto

dark_src Punkte 406

Manchmal muss ich nur in der Lage sein, den Enum-Wert abzurufen und seinen Namen ähnlich wie bei Java World zu identifizieren.

module Enum
     def get_value(str)
       const_get(str)
     end
     def get_name(sym)
       sym.to_s.upcase
     end
 end

 class Fruits
   include Enum
   APPLE = "Delicious"
   MANGO = "Sweet"
 end

 Fruits.get_value('APPLE') #'Delicious'
 Fruits.get_value('MANGO') # 'Sweet'

 Fruits.get_name(:apple) # 'APPLE'
 Fruits.get_name(:mango) # 'MANGO'

Dies erfüllt meiner Meinung nach den Zweck von enum und hält es auch sehr erweiterbar. Sie können mehr Methoden zur Enum-Klasse hinzufügen und viola erhalten sie kostenlos in allen definierten Enums. z.B. get_all_names und solche Sachen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X