I metodi di istanza sono definiti all'interno di un blocco di definizione di classe. I metodi di classe sono definiti come metodi singleton sulla classe singleton di una classe, nota anche in modo informale come "metaclasse" o "eigenclass". private
non è una parola chiave, ma un metodo ( Modulo # privato ).
Questa è una chiamata al metodo self#private
/ A#private
che "attiva" l'accesso privato per tutte le definizioni del metodo dell'istanza imminente fino a quando non viene attivato diversamente:
class A
private
def instance_method_1; end
def instance_method_2; end
# .. and so forth
end
Come notato in precedenza, i metodi di classe sono in realtà metodi singleton definiti sulla classe singleton.
def A.class_method; end
O usando una sintassi speciale per aprire il corpo della definizione della classe anonima e singleton di A:
class << A
def class_method; end
end
Il destinatario del "messaggio privato" - self - inside class A
è l'oggetto classe A. self all'interno del class << A
blocco è un altro oggetto, la classe singleton.
Il seguente esempio in realtà chiama due diversi metodi chiamati private , usando due diversi destinatari o target per la chiamata. Nella prima parte, definiamo un metodo di istanza privato ("sulla classe A"), in quest'ultima definiamo un metodo di classe privata (è in effetti un metodo singleton sull'oggetto classe singleton di 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
Ora, riscrivi un po 'questo esempio:
class A
private
def self.class_method; end
end
Riesci a vedere l'errore [che i progettisti del linguaggio Ruby] hanno fatto? Attivare l'accesso privato per tutti i prossimi metodi di istanza di A, ma si procede a dichiarare un metodo singleton su una classe diversa, la classe singleton.