Les méthodes d'instance sont définies dans un bloc de définition de classe. Les méthodes de classe sont définies comme des méthodes singleton sur la classe singleton d'une classe, également connues de manière informelle sous le nom de "métaclasse" ou "classe propre". private
n'est pas un mot-clé, mais une méthode ( Module # private ).
Ceci est un appel à method self#private
/ A#private
qui "bascule" l'accès privé pour toutes les définitions de méthode d'instance à venir jusqu'à ce qu'il soit basculé autrement:
class A
private
def instance_method_1; end
def instance_method_2; end
# .. and so forth
end
Comme indiqué précédemment, les méthodes de classe sont vraiment des méthodes singleton définies sur la classe singleton.
def A.class_method; end
Ou en utilisant une syntaxe spéciale pour ouvrir le corps de définition de la classe singleton anonyme de A:
class << A
def class_method; end
end
Le récepteur du "message privé" - self -inside class A
est l'objet de classe A. self inside the class << A
block est un autre objet, la classe singleton.
L'exemple suivant appelle en réalité deux méthodes différentes appelées privées , en utilisant deux destinataires ou cibles différents pour l'appel. Dans la première partie, nous définissons une méthode d'instance privée ("sur la classe A"), dans la seconde nous définissons une méthode de classe privée (est en fait une méthode singleton sur l'objet classe singleton de 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
Maintenant, réécrivez un peu cet exemple:
class A
private
def self.class_method; end
end
Pouvez-vous voir l'erreur [que les concepteurs du langage Ruby] ont commise? Vous basculez sur l'accès privé pour toutes les méthodes d'instance à venir de A, mais continuez à déclarer une méthode singleton sur une classe différente, la classe singleton.