Die Programmiersprache Ruby

Blog| Forum| Wiki  

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