Методи екземплярів визначаються всередині блоку визначення класу. Методи класу визначаються як одиночні методи класу синглтон класу, також неофіційно відомі як "метаклас" або "власний клас". 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
Одержувач "повідомлення приватне" - самоврядування всерединіclass A
- це об'єкт класу А. Я всередині class << A
блоку - це ще один об'єкт, клас синглтон.
Наступний приклад насправді викликає два різні методи, які називаються приватними , використовуючи два різних одержувачів або цілі для виклику. У першій частині ми визначаємо метод приватного екземпляра ("для класу 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, але продовжуєте оголошувати метод одиночного класу для іншого класу, одиночного класу.