Metody instancji są zdefiniowane w bloku definicji klasy. Metody klasowe są zdefiniowane jako metody singletonowe w klasie singleton klasy, zwanej także nieformalnie „metaklasą” lub „klasą elektroniczną”. private
nie jest słowem kluczowym, ale metodą ( moduł nr prywatny ).
Jest to wywołanie metody self#private
/, A#private
które „włącza” prywatny dostęp do wszystkich przyszłych definicji metod instancji, dopóki nie zostanie przełączone inaczej:
class A
private
def instance_method_1; end
def instance_method_2; end
# .. and so forth
end
Jak wspomniano wcześniej, metody klasowe są tak naprawdę metodami singletonowymi zdefiniowanymi w klasie singleton.
def A.class_method; end
Lub używając specjalnej składni, aby otworzyć treść definicji anonimowej, singletonowej klasy A:
class << A
def class_method; end
end
Odbiorca „wiadomości prywatnej” - self - inside class A
jest obiektem klasy A. self wewnątrz class << A
bloku to kolejny obiekt, klasa singleton.
Poniższy przykład w rzeczywistości wywołuje dwie różne metody nazywane prywatnymi , używając dwóch różnych odbiorców lub celów połączenia. W pierwszej części definiujemy metodę instancji prywatnej („w klasie A”), w drugiej definiujemy metodę klasy prywatnej (w rzeczywistości jest to metoda singletonu na obiekcie klasy singleton 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
Teraz przepisz trochę ten przykład:
class A
private
def self.class_method; end
end
Czy widzisz błąd [popełniony przez projektantów języka Ruby]? Przełączasz na dostęp prywatny dla wszystkich przyszłych metod instancji klasy A, ale kontynuujesz deklarowanie metody singleton w innej klasie, klasie singleton.