Методы экземпляра определяются внутри блока определения класса. Методы класса определяются как одноэлементные методы для одноэлементного класса класса, также неофициально известного как «метакласс» или «собственный класс». private
это не ключевое слово, а метод ( Module # private ).
Это вызов метода self#private
/, A#private
который «включает» частный доступ для всех последующих определений методов экземпляра, пока не переключится иначе:
class A
private
def instance_method_1; end
def instance_method_2; end
# .. and so forth
end
Как отмечалось ранее, методы класса - это действительно одноэлементные методы, определенные в одноэлементном классе.
def A.class_method; end
Или используя специальный синтаксис, чтобы открыть тело определения анонимного одноэлементного класса A:
class << A
def class_method; end
end
Получатель «сообщения приватного» - self- inside class A
- это объект класса A. self внутри class << A
блока - это другой объект, синглтон-класс.
В следующем примере в действительности вызывается два разных метода, называемых private , с использованием двух разных получателей или целей для вызова. В первой части мы определяем метод частного экземпляра («в классе A»), во второй мы определяем метод частного класса (фактически это одноэлементный метод в объекте класса 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
Теперь немного перепишем этот пример:
class A
private
def self.class_method; end
end
Вы видите ошибку [которую сделали дизайнеры языка Ruby]? Вы переключаетесь на закрытый доступ для всех будущих методов экземпляра A, но приступаете к объявлению одноэлементного метода в другом классе, одноэлементном классе.