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?

Jeremy Smith
quelle

Antworten:

244

Was Sie gepostet haben, sollte perfekt funktionieren:

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

Foo::CONSTANT_NAME
# => ["a", "b", "c"]
Dylan Markow
quelle
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
maček
quelle
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"
Aidan
quelle
17

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

Ja da ist:

Foo::CONSTANT_NAME
Jörg W Mittag
quelle
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