Frage

Ich möchte nur die beste Art und Weise wissen, eine C # Stil Aufzählung in Ruby zu emulieren.

War es hilfreich?

Lösung

  

Insbesondere würde Ich mag logische Tests gegen die Menge von Werten einer Variable gegeben ausführen zu können. Beispiel wäre der Zustand eines Fensters: „minimiert, maximiert, geschlossen, offen“

Wenn Sie die Aufzählungen müssen Werte abzubilden (zB Sie gleich 0 minimiert müssen, maximiert 100 bis gleich, etc.) ich einen Hash von Symbolen auf Werte verwenden würde, wie folgt aus:

WINDOW_STATES = { :minimized => 0, :maximized => 100 }.freeze

Das gefrier (wie nate sagt) hält von Ihnen Dinge in Zukunft durch Zufall zu brechen. Sie können prüfen, ob etwas, indem Sie diese

gültig ist
WINDOW_STATES.keys.include?(window_state)

Alternativ, wenn Sie keine Werte benötigen, und müssen nur überprüfen ‚Mitgliedschaft‘ dann ein Array ist in Ordnung

WINDOW_STATES = [:minimized, :maximized].freeze

Verwenden Sie es wie folgt

WINDOW_STATES.include?(window_state)

Wenn Sie Ihre Schlüssel gehen Strings sein (wie zum Beispiel ein ‚Staat‘ Feld in einer RoR app), dann können Sie ein Array von Strings verwenden. Ich tue dies die ganze Zeit in vielen unserer Schienen-Anwendungen.

WINDOW_STATES = %w(minimized maximized open closed).freeze

Das ist ziemlich viel, was Schienen validates_inclusion_of Validator Zweck gebaut: -)

Persönliche Anmerkung:

Ich mag es nicht eingeben enthalten? die ganze Zeit, so habe ich diese (es wegen der .in nur kompliziert ist (1, 2, 3) Fall:

class Object

    # Lets us write array.include?(x) the other way round
    # Also accepts multiple args, so we can do 2.in?( 1,2,3 ) without bothering with arrays
    def in?( *args )
        # if we have 1 arg, and it is a collection, act as if it were passed as a single value, UNLESS we are an array ourselves.
        # The mismatch between checking for respond_to on the args vs checking for self.kind_of?Array is deliberate, otherwise
        # arrays of strings break and ranges don't work right
        args.length == 1 && args.first.respond_to?(:include?) && !self.kind_of?(Array) ?
            args.first.include?( self ) :
            args.include?( self )
        end
    end
end

Auf diese Weise können Sie eingeben

window_state.in? WINDOW_STATES

Andere Tipps

Es ist nicht ganz die gleiche, aber ich werde oft einen Hash für diese Art der Sache bauen:

STATES = {:open => 1, :closed => 2, :max => 3, :min => 4}.freeze()

die Hash Einfrieren hält mich versehentlich seinen Inhalt zu ändern.

Außerdem, wenn Sie einen Fehler erhöhen möchten, wenn etwas den Zugriff auf die nicht vorhanden ist, können Sie einen defualt Proc verwenden, dies zu tun:

STATES = Hash.new { |hash, key| raise NameError, "#{key} is not allowed" }
STATES.merge!({:open => 1, :closed => 2, :max => 3, :min => 4}).freeze()

STATES[:other] # raises NameError

Ich glaube nicht, Rubin wahr Aufzählungen unterstützt - allerdings gibt es noch Lösungen zur Verfügung

.

Aufzählungen und Ruby

Der einfachste Weg, eine Enum in Ruby zu definieren, eine Klasse mit konstanten Variablen zu verwenden.

class WindowState
  Open = 1
  Closed = 2
  Max = 3
  Min = 4
end

Erstellen einer Klasse oder eines Hash wie andere gesagt haben funktioniert. Ruby, was jedoch zu tun ist, Symbole . Symbole in Ruby beginnen mit einem Doppelpunkt und wie folgt aussehen:

greetingtype = :hello

Sie sind eine Art, wie Objekte, die nur aus einem Namen bestehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top