Lo importante a entender es que no existe un método de clase en Ruby.
Un método de clase es realmente solo un método singleton. No hay nada especial sobre los métodos de clase. Cada objeto puede tener métodos singleton. Simplemente los llamamos "métodos de clase" cuando el objeto es Class
porque "el método singleton de una instancia de Class
" es demasiado largo y difícil de manejar.
¡Espere! ¿Dije "método singleton"?
Otra cosa importante a entender es que no existe el método singleton en Ruby.
Un método singleton es realmente un método de instancia antiguo aburrido de la clase singleton. No hay nada especial sobre los métodos singleton. Son solo métodos de instancia como cualquier otro método de instancia.
De hecho, Ruby solo tiene métodos de instancia. Sin funciones, sin constructores, sin métodos estáticos, sin métodos de clase, sin funciones de módulo, sin métodos singleton.
La pregunta no es "¿es este un método de clase, es un método singleton", sino "en qué módulo se define este método?"
Los "métodos Singleton" son realmente métodos de instancia definidos en la clase Singleton. La sintaxis para acceder a la clase singleton de foo
es
class << foo
end
También hay un método Object#singleton_class
que devuelve la clase singleton de un objeto.
¿Por qué estoy insistiendo tan agresivamente en el hecho de que cada método es un método de instancia y que los métodos de clase no existen? ¡Porque significa que el modelo de objetos de Ruby es mucho más simple de lo que la gente piensa! Después de todo, en su pregunta, ya muestra que sabe cómo alias métodos de instancia, pero dice que no sabe cómo alias métodos de clase. ¡Pero eso está mal! Usted hace saber cómo los métodos de clase alias, ya que son métodos de instancia sólo . Si te hubieran enseñado este hecho correctamente, ¡nunca hubieras necesitado hacer esta pregunta!
Una vez que comprenda que cada método es un método de instancia, y que lo que llamamos "métodos singleton" son solo métodos de instancia de la clase singleton, la solución queda clara:
singleton_class.alias_method :a_new_class_method, :a_class_method
Nota: cuando escribí anteriormente que "no hay tal cosa como X", lo que quise decir fue que "no hay tal cosa como X en el lenguaje Ruby ". Eso no significa que esos conceptos no existan en la comunidad Ruby .
Hablamos regularmente de "métodos singleton" y "métodos de clase", simplemente porque es más fácil que hablar de "métodos de instancia de la clase singleton" o "métodos de instancia de la clase singleton de un objeto que resulta ser una instancia de la Class
clase ". Hay incluso métodos como Object#define_singleton_method
, Object#singleton_method
, Object#singleton_methods
,Module#private_class_method
, Module#public_class_method
, y Module#module_function
en la biblioteca núcleo Ruby. Pero siempre es importante recordar que esos no son conceptos de lenguaje. Esos son conceptos comunitarios que solo existen en nuestras cabezas y en los nombres de algunos métodos de biblioteca.
extend ClassMethods
solución. +1