Важно понимать, что в Ruby не существует метода класса .
Метод класса на самом деле просто одноэлементный метод. В методах класса нет ничего особенного. Каждый объект может иметь одноэлементные методы. Мы просто называем их «методами класса», когда объект является « Class
потому что» метод синглтона экземпляра Class
«слишком длинный и громоздкий.
Подождите! Я сказал "метод синглтона"?
Еще одна важная вещь, которую нужно понять, это то, что в Ruby не существует такого метода, как синглтон .
Одноэлементный метод - это на самом деле просто обычный скучный старый метод экземпляра одноэлементного класса. В одноэлементных методах нет ничего особенного. Они просто методы экземпляра, как и любой другой метод экземпляра.
На самом деле, в Ruby есть только методы экземпляра. Нет функций, нет конструкторов, нет статических методов, нет методов класса, нет функций модуля, нет одноэлементных методов.
Вопрос не в том, «это метод класса, метод одиночный», а в том, «в каком модуле определен этот метод?».
«Методы Singleton» - это действительно методы экземпляра, определенные в классе Singleton. Синтаксис для доступа к одноэлементному классу foo
:
class << foo
end
Существует также метод, Object#singleton_class
который возвращает одноэлементный класс объекта.
Почему я так настойчиво говорю о том, что каждый метод является методом экземпляра, а методы класса не существуют? Потому что это означает, что объектная модель Ruby намного проще, чем думают люди! В конце концов, в своем вопросе вы уже показали, что знаете, как псевдонимы методов экземпляра, но вы говорите, что не знаете, как псевдонимы методов класса. Но это неправильно! Вы делаете знаете , как методы класса псевдоним, потому что они просто методы экземпляра . Если бы вас правильно учили этому факту, вам никогда бы не пришлось задавать этот вопрос!
Как только вы поймете, что каждый метод является методом экземпляра и что то, что мы называем «одноэлементными методами», является просто методами экземпляра одноэлементного класса, решение становится ясным:
singleton_class.alias_method :a_new_class_method, :a_class_method
Примечание: когда я писал выше, что «нет такой вещи, как X», я имел в виду, что « в языке Ruby нет такой вещи, как X ». Это не означает, что эти понятия не существуют в сообществе Ruby .
Мы регулярно говорим о «одноэлементных методах» и «методах класса» просто потому, что это проще, чем говорить о «методах экземпляра класса singleton» или «методах экземпляра класса singleton объекта, который является экземпляром Class
класса ». Есть даже такие методы , как Object#define_singleton_method
, Object#singleton_method
, Object#singleton_methods
, Module#private_class_method
, Module#public_class_method
, и Module#module_function
в основной библиотеке Ruby. Но всегда важно помнить, что это не языковые понятия. Это концепции сообщества, которые существуют только в наших головах и в названиях некоторых библиотечных методов.