Os métodos de instância são definidos dentro de um bloco de definição de classe. Os métodos de classe são definidos como métodos singleton na classe singleton de uma classe, também conhecidos informalmente como "metaclasse" ou "autoclasse". private
não é uma palavra-chave, mas um método ( Módulo # privado ).
Esta é uma chamada ao método self#private
/ na A#private
qual "alterna" o acesso privado para todas as próximas definições de método de instância até alternar de outra forma:
class A
private
def instance_method_1; end
def instance_method_2; end
# .. and so forth
end
Como observado anteriormente, os métodos de classe são realmente métodos singleton definidos na classe singleton.
def A.class_method; end
Ou usando uma sintaxe especial para abrir o corpo da definição da classe anônima e singleton de A:
class << A
def class_method; end
end
O receptor da "mensagem privada" - self -inside class A
é o objeto de classe A. self dentro do class << A
bloco é outro objeto, a classe singleton.
O exemplo a seguir está na realidade chamando dois métodos diferentes chamados private , usando dois destinatários ou destinos diferentes para a chamada. Na primeira parte, definimos um método de instância privada ("na classe A"); na segunda, definimos um método de classe privada (na verdade, é um método singleton no objeto de 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
Agora, reescreva este exemplo um pouco:
class A
private
def self.class_method; end
end
Você consegue ver o erro [que os designers de linguagem Ruby] cometeram? Você ativa o acesso privado para todos os métodos de instância futuros de A, mas continua a declarar um método singleton em uma classe diferente, a classe singleton.