La chose importante à comprendre est qu'il n'existe pas de méthode de classe dans Ruby.
Une méthode de classe n'est vraiment qu'une méthode singleton. Il n'y a rien de spécial dans les méthodes de classe. Chaque objet peut avoir des méthodes singleton. Nous les appelons simplement «méthodes de classe» lorsque l'objet est un Class
car «la méthode singleton d'une instance de Class
» est trop longue et trop lourde.
Attendre! Ai-je dit "méthode singleton"?
Une autre chose importante à comprendre est qu'il n'existe pas de méthode singleton en Ruby.
Une méthode singleton n'est en fait qu'une ancienne méthode d'instance ennuyeuse ordinaire de la classe singleton. Les méthodes singleton n'ont rien de spécial. Ce ne sont que des méthodes d'instance comme toute autre méthode d'instance.
En fait, Ruby n'a que des méthodes d'instance. Aucune fonction, aucun constructeur, aucune méthode statique, aucune méthode de classe, aucune fonction de module, aucune méthode singleton.
La question n'est pas "est-ce une méthode de classe, est-ce une méthode singleton", mais plutôt "dans quel module cette méthode est-elle définie?"
Les "méthodes singleton" sont en fait des méthodes d'instance définies dans la classe singleton. La syntaxe pour accéder à la classe singleton de foo
est
class << foo
end
Il existe également une méthode Object#singleton_class
qui renvoie la classe singleton d'un objet.
Pourquoi suis-je si agressif sur le fait que chaque méthode est une méthode d'instance et que les méthodes de classe n'existent pas? Parce que cela signifie que le modèle objet de Ruby est beaucoup plus simple que les gens ne le pensent! Après tout, dans votre question, vous montrez déjà que vous savez comment alias les méthodes d'instance, mais vous dites que vous ne savez pas comment alias les méthodes de classe. Mais c'est faux! Vous ne savez comment les méthodes de classe d'alias, parce qu'ils ne sont que des méthodes d'instance . Si vous aviez appris ce fait correctement, vous n'auriez jamais eu besoin de poser cette question!
Une fois que vous comprenez que chaque méthode est une méthode d'instance et que ce que nous appelons les "méthodes singleton" ne sont que des méthodes d'instance de la classe singleton, la solution devient claire:
singleton_class.alias_method :a_new_class_method, :a_class_method
Remarque: lorsque j'ai écrit ci-dessus «il n'y a rien de tel que X», je voulais dire «qu'il n'y a pas de chose telle que X dans le langage Ruby ». Cela ne signifie pas que ces concepts n'existent pas dans la communauté Ruby .
Nous parlons régulièrement de «méthodes singleton» et de «méthodes de classe», simplement parce que c'est plus facile que de parler de «méthodes d'instance de la classe singleton» ou de «méthodes d'instance de la classe singleton d'un objet qui se trouve être une instance de la Class
classe ". Il existe des méthodes comme même Object#define_singleton_method
, Object#singleton_method
, Object#singleton_methods
, Module#private_class_method
, Module#public_class_method
, et Module#module_function
dans la bibliothèque de base Ruby. Mais il est toujours important de se rappeler que ce ne sont pas des concepts de langage. Ce sont des concepts communautaires qui n'existent que dans nos têtes et dans les noms de certaines méthodes de bibliothèque.