Konstanten sind ähnlich wie Variablen Verweise auf ein spezielles Objekt, nur sollte sich der Wert einer Konstanten im gesamten Programm nicht verändern. Per Konvention werden Konstanten in Ruby vollständig groß geschrieben, aber Ruby erkennt einen Ausdruck bereits als Konstante, wenn nur der erste Buchstabe groß geschrieben ist.
1
2
3
4
5
6
|
KONVENTIONELL_KORREKTE_KONSTANTE = 15
UnkonventionelleKonstante = "XY"
puts defined? KONVENTIONELL_KORREKTE_KONSTANTE #=> constant
puts defined? UnkonventionelleKonstante #=> constant
#Das zeigt auch, dass Klassen- und Modulnamen nichts weiter als Konstanten sind:
puts defined? Kernel #=> constant |
Variable Konstanten
In Ruby sind Konstanten nicht so konstant wie ihre Bezeichnung vermuten lässt. Es gilt als unschön, aber es ist möglich, einer Konstanten nach ihrer Wertzuweisung erneut einen anderen Wert zuzuweisen; Ruby gibt dann eine Warnung aus, nimmt es aber ansonsten hin.
1
2
3
|
NICHT_KONSTANTE_KONSTANTE = 1
NICHT_KONSTANTE_KONSTANTE = "Test"
#=>Warning: Already initialized constant NICHT_KONSTANTE_KONSTANTE |
Das führt bei Ruby-Neulingen häufig zu Irritationen, da sie vielleicht gewohnt sind, Variablennamen groß zu schreiben:
1
2
3
|
Variable = 1
Variable = 2
#=>Warning: Already initialized constant Variable |
Arrays, Hashes und Ähnliches
Besonders hinfällig ist der Begriff »Konstante« im Falle von ohnehin variablen Objekten wie zum Beispiel Arrays. Wird ein solches Objekt einer Konstanten zugewiesen, meckert Ruby nicht einmal, wenn es sich drastisch verändert:
1
2
3
|
ARRAY = [1,"XY", /ttt/, (1..99), Math::PI]
ARRAY.clear
puts ARRAY #=> [] |
Um zumindest solchen Dingen Abhilfe zu schaffen, kann man die Methode Object#freeze verwenden, die das jeweilige Objekt auf seinen Status »festnagelt«. Ein einmal eingefrorenes Objekt kann nie wieder aufgetaut werden, das heißt aber nicht, dass eine totale Neuzuweisung unmöglich wäre.
1
2
3
4
5
|
HASH = {"X" => 1, :Y => /T/i}
HASH.freeze
HASH.clear #=> RuntimeError: Can't modify frozen hash
HASH = {}
#=>Warning: Already initialized constant HASH |
Alternativer Abruf
Mithilfe der Methoden Module#const_get und Module#const_set können Konstanten gelesen bzw. erstellt werden. Dies kann zum Beispiel bei Metaprogrammierung nützlich sein.
1
2
3
4
|
module A
end
A.const_set(:KONSTANTE, "Test")
puts A.const_get(:KONSTANTE) #=> Test |
Siehe auch