Los métodos de instancia se definen dentro de un bloque de definición de clase. Los métodos de clase se definen como métodos singleton en la clase singleton de una clase, también conocida informalmente como "metaclase" o "clase propia". private
no es una palabra clave, sino un método ( Módulo # privado ).
Esta es una llamada al método self#private
/ A#private
que "activa" el acceso privado para todas las próximas definiciones de métodos de instancia hasta que se active de otra manera:
class A
private
def instance_method_1; end
def instance_method_2; end
# .. and so forth
end
Como se señaló anteriormente, los métodos de clase son realmente métodos singleton definidos en la clase singleton.
def A.class_method; end
O utilizando una sintaxis especial para abrir el cuerpo de definición de la clase anónima singleton de A:
class << A
def class_method; end
end
El receptor del "mensaje privado" - self - inside class A
es el objeto de clase A. self dentro del class << A
bloque es otro objeto, la clase singleton.
El siguiente ejemplo es en realidad llamar a dos métodos diferentes llamados privados , utilizando dos destinatarios u objetivos diferentes para la llamada. En la primera parte, definimos un método de instancia privada ("en la clase A"), en la última definimos un método de clase privada (de hecho, es un método singleton en el objeto de clase 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
Ahora, reescribe este ejemplo un poco:
class A
private
def self.class_method; end
end
¿Puedes ver el error que cometieron [los diseñadores de lenguaje Ruby]? Alterna el acceso privado para todos los métodos de instancia próximos de A, pero procede a declarar un método singleton en una clase diferente, la clase singleton.