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?Versuchen Sie das Inum. https://github.com/alfa-jpn/inum
class Color < Inum::Base
define :RED
define :GREEN
define :BLUE
end
Color::RED
Color.parse('blue') # => Color::BLUE
Color.parse(2) # => Color::GREEN
mehr sehen https://github.com/alfa-jpn/inum#usage
Eine weitere Möglichkeit, eine Enum mit konsistenter Gleichbehandlung zu imitieren (schamlos von Dave Thomas übernommen). Erlaubt offene Enums (ähnlich wie Symbole) und geschlossene (vordefinierte) Enums.
class Enum
def self.new(values = nil)
enum = Class.new do
unless values
def self.const_missing(name)
const_set(name, new(name))
end
end
def initialize(name)
@enum_name = name
end
def to_s
"#{self.class}::#@enum_name"
end
end
if values
enum.instance_eval do
values.each { |e| const_set(e, enum.new(e)) }
end
end
enum
end
end
Genre = Enum.new %w(Gothic Metal) # creates closed enum
Architecture = Enum.new # creates open enum
Genre::Gothic == Genre::Gothic # => true
Genre::Gothic != Architecture::Gothic # => true
Ich denke, der beste Weg, um Aufzählung wie Typen zu implementieren ist mit Symbolen, da die ziemlich viel als Integer verhalten (wenn es um Leistung kommt, wird object_id verwendet, um Vergleiche zu machen); Sie müssen nicht über Indizierung kümmern und sie sehen wirklich ordentlich in Ihrem Code xD
Ein anderer Ansatz ist die Verwendung einer Ruby-Klasse mit einem Hash, der Namen und Werte enthält, wie im Folgenden beschrieben RubyFleebie Blogbeitrag . Auf diese Weise können Sie leicht zwischen Werten und Konstanten konvertieren (insbesondere wenn Sie eine Klassenmethode hinzufügen, um den Namen für einen bestimmten Wert nachzuschlagen).
- See previous answers
- Weitere Antworten anzeigen