Instanzmethoden werden in einem Klassendefinitionsblock definiert. Klassenmethoden werden als Singleton-Methoden für die Singleton-Klasse einer Klasse definiert, die informell auch als "Metaklasse" oder "Eigenklasse" bezeichnet wird. private
ist kein Schlüsselwort, sondern eine Methode ( Modul # privat ).
Dies ist ein Aufruf von method self#private
/, A#private
der den privaten Zugriff für alle bevorstehenden Instanzmethodendefinitionen "umschaltet", bis etwas anderes umgeschaltet wird:
class A
private
def instance_method_1; end
def instance_method_2; end
# .. and so forth
end
Wie bereits erwähnt, sind Klassenmethoden wirklich Singleton-Methoden, die für die Singleton-Klasse definiert sind.
def A.class_method; end
Oder verwenden Sie eine spezielle Syntax, um den Definitionskörper der anonymen Singleton-Klasse von A zu öffnen:
class << A
def class_method; end
end
Der Empfänger der "Nachricht privat" - self - inside class A
ist das Klassenobjekt A. self innerhalb des class << A
Blocks ist ein weiteres Objekt, die Singleton-Klasse.
Das folgende Beispiel ruft in Wirklichkeit zwei verschiedene Methoden auf, die als privat bezeichnet werden , wobei zwei verschiedene Empfänger oder Ziele für den Anruf verwendet werden. Im ersten Teil definieren wir eine private Instanzmethode ("für Klasse A"), im letzteren definieren wir eine private Klassenmethode (ist tatsächlich eine Singleton-Methode für das Singleton-Klassenobjekt von A).
class A
# self is A and private call "A.private()"
private def instance_method; end
class << self
# self is A's singleton class and private call "A.singleton_class.private()"
private def class_method; end
end
end
Schreiben Sie dieses Beispiel jetzt ein wenig um:
class A
private
def self.class_method; end
end
Können Sie den Fehler sehen, den Ruby-Sprachdesigner gemacht haben? Sie schalten den privaten Zugriff für alle bevorstehenden Instanzmethoden von A um, deklarieren jedoch eine Singleton-Methode für eine andere Klasse, die Singleton-Klasse.