Важливо зрозуміти, що у Ruby не існує такого поняття, як метод класу .
Метод класу насправді є лише однотонним методом. У класових методах немає нічого особливого. У кожному об'єкті можуть бути одинакові методи. Ми просто називаємо їх "методами класу", коли об'єкт є тим, Class
що "однотонний метод екземпляра Class
" занадто довгий і громіздкий.
Зачекайте! Я сказав "метод одиночки"?
Ще одна важлива річ, яку потрібно зрозуміти, це те, що в Рубі не існує такого поняття, як синглтон .
Метод синглтон - це просто звичайний нудний старий метод екземпляра класу синглтон. Немає нічого особливого в однотонних методах. Вони просто методи екземпляра, як і будь-який інший метод.
Насправді, у Рубі є лише методи екземпляра. Ні функцій, ні конструкторів, ні статичних методів, ні методів класів, ні функцій модулів, ні однотонних методів.
Питання не в тому, "це метод класу, це метод однотонний", а в тому, "в якому модулі визначений цей метод?"
"Методи Singleton" - це дійсні методи, визначені в класі Singleton. Синтаксис доступу до класу синглтон foo
є
class << foo
end
Існує також метод, Object#singleton_class
який повертає однотонний клас об'єкта.
Чому я так агресивно замислююся про те, що кожен метод є методом екземпляра, а методи класу не існують? Тому що це означає, що об’єктна модель Рубі набагато простіша, ніж люди думають, що це! Зрештою, у вашому запитанні ви вже показуєте, що знаєте як псевдоніми примірників методів, але ви говорите, що не знаєте, як псевдоніми методів класу. Але це неправильно! Ви робите знаєте , як методи класу псевдонім, бо вони просто методи екземпляра . Якби ви цього навчали належним чином, вам ніколи не потрібно було б ставити це питання!
Як тільки ви зрозумієте, що кожен метод є методом екземпляра і що те, що ми називаємо "однотонними методами" - це лише методи екземпляра класу синглтон, рішення стає зрозумілим:
singleton_class.alias_method :a_new_class_method, :a_class_method
Зауважте: коли я писав вище, що "не існує такого поняття, як X", я мав на увазі, що " в рубінській мові немає такого поняття, як X ". Це не означає, що ці концепції не існують у спільноті Рубі .
Ми регулярно говоримо про "методи одиночного типу" та "методи класу", просто тому, що це простіше, ніж говорити про "методи екземпляра класу синглтон" або "методи екземпляра класу синглтон" об'єкта, який, як буває, є екземпляром Class
класу ". Є навіть такі методи , як Object#define_singleton_method
, Object#singleton_method
, Object#singleton_methods
, Module#private_class_method
, Module#public_class_method
, і Module#module_function
в основний бібліотеці Ruby. Але завжди важливо пам’ятати, що це не мовні поняття. Це поняття спільноти, які існують лише в наших головах та в назвах деяких бібліотечних методів.
extend ClassMethods
рішення. +1