Методы экземпляра определены внутри блока определения класса. Методы класса определяются как одноэлементные методы для одноэлементного класса класса, также неофициально известного как «метакласс» или «собственный класс». private
- это не ключевое слово, а метод (Module # private).
Это вызов метода _2 _ / _ 3_, который «переключает» частный доступ для всех будущих определений методов экземпляра, пока не будет переключен иначе:
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 - внутри class A
является объект класса A. self внутри блока class << A
- это другой объект, одноэлементный класс.
В следующем примере на самом деле вызываются два разных метода, называемых private, с использованием двух разных получателей или целей для вызова. В первой части мы определяем метод частного экземпляра («в классе A»), во второй - мы определяем метод частного класса (на самом деле это одноэлементный метод для объекта одноэлементного класса 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, но переходите к объявлению одноэлементного метода в другом классе, одноэлементном классе.
person
Martin Andersson
schedule
08.11.2016