Öffentliche Konstanten
Konstanten in Ruby sind standardmäßig immer sichtbar. Ein Beispiel:
# person.rb
class Person
ADULT_AGE = 18
end
und der Zugriff auf den Wert:
Person::ADULT_AGE # => 18
Allerdings ist es oft gar nicht notwendig, dass die Konstanten public sind. Zum Beispiel, wenn sie ein Resultat von Replace Magic Numbers sind. Und wenn sie nur innerhalb der Klasse benötigt werden, sollten sie auch aus der öffentlichen API genommen werden.
Private Konstanten
Um eine Konstante nach außen hin unsichtbar zu machen, reicht es nicht aus, sie lediglich auf private zu setzen:
# person.rb
class Person
private
ADULT_AGE = 18
end
denn sie ist dann immer noch erreichbar:
Person::ADULT_AGE # => 18
Seit Ruby 1.9.3 können Konstanten mit Hilfe von Module#private_constant explizit privatisiert werden:
# person.rb
class Person
ADULT_AGE = 18
private_constant :ADULT_AGE
def initialize age
@age = age
end
def adult?
@age >= ADULT_AGE
end
end
Sie sind dann tatsächlich nicht mehr öffentlich und der Versuch, von außen auf sie zuzugreifen, löst einen NameError aus:
Person::ADULT_AGE
# => NameError: private constant Person::ADULT_AGE referenced
Innerhalb der Klasse sind noch sehr wohl erreichbar. Die boolsche Methode adult? nutzt die private Konstante:
Person.new(18).adult? # => true
Öffentliche und Private Konstanten auflisten
In dem folgenden Beispiel ist RETIREMENT_AGE öffentlich und ADULT_AGE privat:
# person.rb
class Person
RETIREMENT_AGE = 68
ADULT_AGE = 18
private_constant :ADULT_AGE
end
Alle öffentlichen Konstanten der Klasse können mit constants aufgelistet werden:
Person.constants # => [:RETIREMENT_AGE]
Die gleiche Methode allerdings mit dem Parameter false listet alle Konstanten (öffentlich und privat) auf:
Person.constants false # => [:RETIREMENT_AGE, :ADULT_AGE]
Dementsprechend lassen sich alle privaten Konstanten ebenfalls auflisten:
Person.constants(false) - Person.constants # => [:ADULT_AGE]