Private Konstanten in Ruby

Ö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]