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.

1voto

horun Punkte 11

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

0voto

Daniel Doubleday Punkte 172

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

0voto

Anu Punkte 11
irb(main):016:0> num=[1,2,3,4]
irb(main):017:0> alph=['a','b','c','d']
irb(main):018:0> l_enum=alph.to_enum
irb(main):019:0> s_enum=num.to_enum
irb(main):020:0> loop do
irb(main):021:1* puts "#{s_enum.next} - #{l_enum.next}"
irb(main):022:1> end

Ausgabe:

1 - a
2 - b
3 - c
4 - d

0voto

goreorto Punkte 302

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

0voto

Philippe Monnet Punkte 1152

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).

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