Zugriff auf die Konstanten einer Klasse


142

Wenn ich folgendes habe:

class Foo
   CONSTANT_NAME = ["a", "b", "c"]

  ...
end

Gibt es eine Möglichkeit, mit zuzugreifen, Foo::CONSTANT_NAMEoder muss ich eine Klassenmethode erstellen, um auf den Wert zuzugreifen?

Antworten:


244

Was Sie gepostet haben, sollte perfekt funktionieren:

class Foo
  CONSTANT_NAME = ["a", "b", "c"]
end

Foo::CONSTANT_NAME
# => ["a", "b", "c"]

2
Hmm, ich muss falsch geschrieben haben, als ich früher getestet habe. Ups :)
Jeremy Smith

12
Damit dies wirklich eine Konstante ist, vergessen Sie nicht, am Ende des Werts ein .freeze hinzuzufügen! CONSTANT_NAME = ["a", "b", "c"].freeze
Mutexkid

6
Immer verwechseln ::und .;)
Nick

Dinge sind schwer zu erkennen, wenn sie in Großbuchstaben geschrieben werden;)
Michael Yin

42

Wenn Sie in Ihrer Klasse zusätzlichen Code schreiben, der die Konstante enthält, können Sie ihn wie einen globalen behandeln.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

Wenn Sie auf die Konstante außerhalb der Klasse zugreifen, stellen Sie ihr den Klassennamen voran, gefolgt von zwei Doppelpunkten

Foo::MY_CONSTANT  #=> hello

42

Einige Alternativen:

class Foo
  MY_CONSTANT = "hello"
end

Foo::MY_CONSTANT
# => "hello"

Foo.const_get :MY_CONSTANT
# => "hello"

x = Foo.new
x.class::MY_CONSTANT
# => "hello"

x.class.const_defined? :MY_CONSTANT
# => true

x.class.const_get :MY_CONSTANT
# => "hello"

17

Gibt es eine Möglichkeit, darauf zuzugreifen Foo::CONSTANT_NAME?

Ja da ist:

Foo::CONSTANT_NAME

Wenn ich versuche, darauf zuzugreifen, habe ich unten Warnung. Warnung: bereits initialisierte Konstante TestData :: CONSTANT_VAR Diese Variable wird nirgendwo anders initialisiert. Warum habe ich diese Warnung?
ASM
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.