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.
Antworten
Zu viele Anzeigen?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.
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
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.